Worth noting that most of these criticisms also apply to existential types, which are fairly common in functional languages (e.g. Haskell).
I think it's the particular combination of only having nominal typing, only allowing the oo-flavor of data abstraction, and encouraging programming with state and using inheritance for code reuse that leads to the object-spaghetti nonsense in heavily-oo Java/C++ codebases.
The problem is not that OO languages have these features; the problem is that they lack other features common to functional languages.