How about a typed Dynamic?

There is a way, but it’s not the simplest. You can implement methods of the Dynamic trait using macros and perform the type-checking in the macro definitions. For example, Shapeless does something like this: https://github.com/milessabin/shapeless/blob/0663667f5fc8c1bbbf30b5926f12a978bd97b137/core/src/main/scala/shapeless/hlists.scala#L116