Tradition is to mix traits from separate sources. However, this is monolithic in another sense. There's another approach, given that x.T is just x.type#T.
class Foo {
class Bar
def dowith(b: Bar) = 42
}
case class HasBars[FX <: Foo](bar: FX#Bar)
val x = new Foo
val hb = HasBars(new x.Bar)
// hb has type HasBars[x.type]
// meaning this compiles
x.dowith(hb.bar)
[FX <: Foo] is also a sensible method type parameter. I've used this technique to split up reflection universe stuff (e.g. add methods) where using dependent method types was inconvenient (surprisingly common).
--
Stephen Compall
If anyone in the MSA is online, you should watch this flythrough.