I'm going to go with inflexibility through excessive data hiding. We all know that abstraction and hiding the implementation are good, but more is not always better. Overdone, you can get an inflexible result that can't cope with changes in requirements. To handle the change, you not only have to modify the class that needs to handle that change, but you also have to create a way for the information it never needed before to be accessible despite layers of data hiding. The trouble is, as with all finding-the-right-balance-for-every-context issues, it takes experience.