Scalaban technikailag nem operator overloading van, egyszerűen csak megengedő a nyelv a metódusnevekkel szemben. Teszem hozzá, ugyanezt tudja pl. a Ruby is. Nyilván ésszel kell használni, de vannak előnyei, pl. lehet custom DSL-t építeni.
Ha szigorúbb szabályokat szeretnél de mégis szeretnéd megőrizni az operator overloadingot, akkor a Lua megoldását érdemes megismerni. Pl. nem tudod egymástól függetlenül definiálni a <, >, <=, >= operátorokat, azt majd a runtime megoldja, hogy melyik metametódusba kell behívni. Talán nem túl meglepő, de ilyesmi Scalaban is van: https://ideone.com/wq9pgb :)
"itt is vannak hülyeségek (pl. Unit visszatérési érték, stb)"
A Unit visszatérési érték értelmes. Az nem is függvény, aminek nincs visszatérési értéke. Ezt a problémát oldja fel a Unit, így tudsz olyan függvényt definiálni, aminek valójában nincs visszatérési értéke. Ennek akkor van jelentősége, amikor egy ilyen függvényt pl. szeretnél függvényreferenciaként átadni.
Még egy gondolat a típusokkal kapcsolatban: pl. Scalaban nincsenek primitív típusok annak ellenére, hogy JVM-re fordul. Azt majd a fordító eldönti, hogy hol tud primitív típust használni és hol referencia típust. Így teljes a típushierarchia, az Any típus magában foglalja az AnyVal értéktípusokat (pl. Boolean, Int) és az AnyRef referenciatípusokat (pl. java.lang.Object) is.