I am recalling my reasoning against OOP long time ago, and now it's easy to formulate it with just one concept: Expression problem ( https://en.wikipedia.org/wiki/Expression_problem ). Namely historically OOP and FP were dealing better with two different kinds of extensions. Since then, a lot of efforts has been spent for both OO and F languages, that the difference is not so big now. Of course, I understand "expression problem" is probably quite deep into theory, and hardly a problem for majority of programmers, but it's one of the fundamentals (in addition to immutability). Now, OOP is type-theoretically more complex, and required big advances in CS theory for formal verification (eg, separation logic), but at the end of the day... it's a matter of taste and purpose of the model programmers are dealing with rather than selecting a programming paradigm.