Another opinion I'd throw out there about not over-using classes is that I think there's a really nice relationship between good, semantic markup, and tagname-based CSS. When we all moved to standards- and CSS-based layouts, we gained the ability to write nice, descriptive CSS like:
navbar a { ... } or
aside h1 { ... }. That relationship between markup and CSS gains us readability, maintainability, more readable markup (without IDs or classes), and most importantly, it makes it a lot easier to remove CSS as the layout evolves. When you create a class you are, by its nature, declaring that it is fair use anywhere that stylesheet is available. That makes it a lot harder to remove (or even alter), and this typically means we end up with CSS that grows and grows and becomes less maintainable.
I worry that telling everyone - especially less advanced developers - that they should use classes only, encourages them down that path.
Similarly (but somewhat unrelated), I sometimes worry about preprocessors because I think they can encourage developers to write overly verbose CSS, since it's so easy to repeat values, instead of looking hard at what can be reused. That's what OOCSS is all about, to me.
My approach is to do my best to figure out what is reusable and generalizable, and turn those into OOCSS-style classes. I find that between that, and more specific classes, I end up about 75% classes. The rest, I think usually is not a class for a good reason, and I prefer to leave it that way.