Я это так вижу. Абстрактный класс используется, когда ты делаешь для пользователя почти всё, кроме может быть нескольких методов. И говоришь - отнаследуйся от моего класса, напиши сам реализацию метода "doSomething" - и всё взлетит.
Интерфейс - это типичный "интерфейс" для проектирования. Когда ты просто дизайнишь как тебя (ну твой сервис) нужно использовать. Какие методы с какими параметрами и возвратом. В каком-то смысле "контракт" между твоим сервисом и его пользователями, без деталей имплементации.
Ещё бывают маркер-интерфейсы, которые без одного метода, просто чтобы помечать классы которые обладают какими-то свойствами.
Наверное еще что-то есть, это то, что мне вспомнилось из общеиспользуемого.