The problems that are mentioned are not problems with OOP. The beauty of OOP is that it creates situations which force the developer to think hard about their architecture and find a more elegant way to do things.
In the Copier, Printer and Scanner example, maybe the question to ask yourself is: “Do I need a Copier? Why not use a Scanner and Printer directly instead of inventing a new abstraction?” Or you could come to an alternative conclusion: “I don’t need to separate a Scanner and Printer since no component needs to use them separately, maybe all I need is a Copier?”
You can’t get more flexibility by combining classes together. All you get out of that is convenience. If you need more flexibility, you should split up your classes. Then some components will end up using both a Scanner and Printer while other components will only use either one.
Also, if you want some Printers to have additional features, why not just have a separate ColorPrinter class or LaserPrinter class which inherits from Printer? Why would you keep adding more properties and methods to such a basic class a Printer?