A lot of different concepts contribute to the concept of Object Oriented Programming. Wikipedia lists mosts of them.
I would characterize the essence of OOP by the use of Objects with Behaviours.
Wikipedia characterizes Objects by the following three properties:
- Identity: the property of an object that distinguishes it from other objects
- State: describes the data stored in the object
- Behavior: describes the methods in the object's interface by which the object can be used
A lot of Object Oriented Language have a concept of classes, but actually, there are also Prototype-based languages like JavaScript.
Functional languages may also use classes (e.g. Type Classes in Haskell). But just because they have classes doesn't mean that they are object oriented or allow object oriented programming. To stay with the example of Haskell: You don't even have Objects! There is no such concept as "Identity"! All you can do is composing pure functions!
Just because someone's using a term named "classes", it doesn't mean they're doing object orientated programming!
OOP is about stateful Objects with behaviour. Though the behaviour of objects don't have to modify that object because new objects can be created instead, you'd loose the need of Objects completely. You wouldn't need Identities anymore, because it doesn't matter if the changes to one object are reflected by other references to the same object because there wouldn't be any changes anymore. All you need are Values (without identity) and Modules and/or Classes for data hiding and encapsulation.
So Yes, imperative programming is inherent to OOP.