You don't lose "type safety", as interfaces retain all type information -- you're not casting `void*` pointers (without the unsafe package), and type conversions are limited and well defined.
It however does pass the type checking to run-time instead of compile-time, which is a trade-off that some feel is worth the language simplicity.