Если работа идет с некой "недоменной" областью — то есть technology for technology — то как правило всегда использую только интерфейсы.
Если проектируется часть соотв. некой доменной области — простой подход такой:
Интерфейсы описывают в большей степени свойства объектов, в то время как классы — это is a отношение.
Абстрактный класс Cat это куда сильнее чем некий интерфейс Feedable. Интерфейсы позволяют описать некую общность поведения,
в то время как абстрактные классы это еще и общность состояний и свойств.