問題
中・大規模なアプリケーションでクラスの集合レベルでアクセス方向を強制したい(MVC, MVVM, MVPやDDDのレイヤー化アーキテクチャ, cleanアーキテクチャ)が private や protected などのアクセス修飾子ではアーキテクチャの原則が解りづらい。
また解りづらいことによりチームメンバーがアクセス修飾子を間違えたりつけ忘れることがある。
回答
sbtのマルチプロジェクト機能を使いましょう1。
sbt Reference Manual — マルチプロジェクト・ビルド
マルチプロジェクト機能によりソースコードをサブプロジェクトごとに分割してサブプロジェクト間で依存関係を宣言することにより、クラスの依存関係を一方向へ限定できます。
また、修飾子ではなくソースコードの配置場所レベルで依存関係が強制されるため、他のメンバーや新規メンバーが修飾子を間違えたり依存関係の原則を破ってしまうような恐れもありません。
このテクニックは各レイヤー間の依存関係を強制したいDDDやclean architectureで特に有効活用されます2。
例: Spring Bootアプリケーションをmavenのmulti moduleで構成する - Qiita
蛇足
Scalaではアクセス修飾子でアクセスを許可するパッケージを指定できます。またそのパッケージは自身を含むものでなくてはいけません(=つまり祖先パッケージのどれかである必要がある)。
一方サブプロジェクトを使用すると、パッケージと関係なくアクセス方向(= 依存関係)を制御できます。
つまり、これらの依存関係の制御は相補的です。サブプロジェクトで大枠を定めてアクセス修飾子で細かい調整を行うと僕は最初誤解していたのですが、サブプロジェクトとアクセス修飾子にはそれぞれできることが違います。
うまく使えば非常に便利ですが、一方で過剰にややこしくもなりやすいため注意して使いましょう。