I think that most people that bash OO fail to understand how to use it properly.
From my experience many are also pretty bad at doing ADTs in module based languages.
OO has quite a few powerful concepts, and not all languages that are OO based explore the same set of concepts.
This is why the best languages to work with, are the ones which offer multi-paradigms, allowing the developers to pick the best abstractions for each scenario.
Any language that offers modules/packages as a way to organize code, regardless of which paradigms it supports.
This is why Modula-2 was named like that.
The original idea of ADT (Abstract Data Types) with modules, is that the module exports the public operations of your type along with its visible definition.
Then all operations on the ADT are done via the public operations.
This was the way of modular programming before OO became mainstream.
From my experience many are also pretty bad at doing ADTs in module based languages.
OO has quite a few powerful concepts, and not all languages that are OO based explore the same set of concepts.
This is why the best languages to work with, are the ones which offer multi-paradigms, allowing the developers to pick the best abstractions for each scenario.