とはいえSmalltalkのSmallIntegerとLargeIntegerのシームレスな互換性に比べると
boxing/unboxingだけでは不十分なのでは?
1 * 10000の結果と1000000 * 100000000000000の結果を全く同じように扱うことができるのは
Integerがオブジェクトであることの恩恵だよね。

primitive typeで同じ事をしようとすると
1. intをIntegerのsubtypeにする。
2. 四則演算などを全てLargeIntegerも扱えるようにoverloadする。
3. overloadはコンパイル時ではなく実行時に解決する。
ってな事が必要になる。
これならintもオブジェクトにしたほうがスッキリする。