Let’s agree first that using object oriented techniques leads to code that is well structured, reusable and easy to manage and maintain.
For a programming language to be object oriented, it has to enable the developer to define types and instantiate them. Encapsulation and data hiding are basic concepts that must be available in addition to other features such as shared members, inheritance, overloading, overriding and polymorphism. If the language enables the developer to implement the above mentioned concepts, we can consider it as object oriented.
The above definition does not dictate how the concepts are supported by the language; we just require them to be supported in a way or another; implementing them is the sole responsibility of the developer.
A more strict definition might go further and dictates that for a language to be object oriented, the concepts mentioned above need to be part of the language constructs. We need terms like classes and interfaces to be part of the language constructs; data encapsulation to be supported through access modifiers that are part of the language itself and polymorphism to be available in the most intuitive manner. Structured exception handling must be fully supported by the language.