"It will implicitly auto-promote types in ways you might not want (i.e. List[Int] :+ String = List[Any])."
Wow, that seems to totally miss the point of using types to help you catch errors.
Wow, that seems to totally miss the point of using types to help you catch errors.
There have been attempts to fix this - WartRemover specifically has a Wart for any uses of Any for example.
Given that the language supports subtype polymorphism, this is exactly how the type inference should work. Any is the narrowest available supertype.
If you don't like it, there's a pretty simple fix: add an explicit type ascription, which you should be doing for the return values of any methods anyway.
The distinction between compile time failure and runtime failure is an important one, but not the only thing going on.