Мне кажется, что иметь интерфейс в качестве отдельного модуля - хороший подход. Это значительно упрощает понимание ваших зависимостей и может помочь вашему коду избежать нежелательной связи с классами реализации. Возможно, вам все еще понадобится зависимость времени выполнения от реализаций, если вы делаете такие вещи, как создание экземпляров динамического класса, но это намного слабее, так что вы не столкнетесь с такими большими проблемами.
Я не вижу никакой причины пытаться сохранить количество модулей небольшим; это просто структура, которая введена, чтобы прояснить, что происходит, и определить, что может с чем взаимодействовать. У вас может быть даже несколько модулей, которые можно использовать в определенных ролях, чтобы вы могли (например) поддерживать причуды конкретных баз данных на вашем уровне персистентности, с которыми модули фактически используются, в зависимости от того, какой профиль Maven используется. (В моем коде я использую это, чтобы отделить несколько специфичных для платформы частей кода от подавляющего большинства независимых от платформы частей.)