&gt; Almost all of that is due to the intentional choice of running on the JVM with high interop compatibility.<p>Here are some counterexamples:<p>(0) Clojure is compatible with Java, but has less warts than Scala. It is not statically typed, but it is internally more unified and consistent. With some exceptions, you only get to see ugly compatibility compromises when you need to interact with Java code.<p>(1) Rust is compatible with C - in fact, it interoperates with other languages that have C FFIs by simply pretending to be C. Nevertheless, outside of specifically designated `unsafe` blocks, which idiomatic Rust only uses sparingly, most code is written in a &quot;modern C++ meets ML&quot; style.<p>&gt; But I&#x27;d take types with class-vs-trait design choices, less-than-ideal match exhaustiveness checks, and type inference incompleteness any day over a language lacking <i>all</i> static typing features.<p>Static typing is a useful feature, but I think it&#x27;s narrow-minded to use it as the only criterion for judging a language&#x27;s merits. For instance, Clojure&#x27;s macros are objectively nicer than Scala&#x27;s, even if both pale in comparison to Racket&#x27;s. Writing multimethods in Clojure is straightforward once you know the syntax, whereas emulating multiparameter type classes in Scala can be confusing unless you know the specifics of how implicit parameters are resolved. (This is, ironically, a direct consequence of Scala&#x27;s richer type system.)