C#のBoxingはあんまり使いたくないです
型情報が失われてしまうのは痛い

↓こういうのがいいなぁ

valVariable: int = 10;
refVariable: int* = valVariable; //refVariableは参照型

すべてのstruct/enumなんかの値型は後ろに*をつけることで
参照型にすることが出来ます
上の例はint型をint*型にBoxingしています。

イメージは↓のように

IBoxed: interface[ T: struct ]
{
 Value: property get{} set{};
}

BoxingClass : class[ T: struct ] ( T, IBoxed[ T ] ){}

int* : alias BoxingClass[ int ];

valVariable: int = 10;
refVariable: int* = new int*( valVariable ); //refVariableは参照型

int*はintとほとんど同じように扱うことが出来ますが、
代入やパラメータに渡すときに参照型の特徴が出てきます
比較はC#のstring同様値比較だと何かと幸せです(が問題もあります)。
代入が参照先の変更になるので、元の値を変更するためのValueプロパティを持ちます。

int*はintへの暗黙の変換を許します(Unboxing)
(型情報は失われていないので安全です)

以下例

val1: int = 100;
ref1: int* = val1;
ref2: int* = ref1;
ref3: int* = ref2;

ref2 = 200; //ref2の参照先を別のint*オブジェクトにします。val1/ref1/ref3には影響ありません

ref3.Value = 300; // ref3の参照先の値を300にします。ref1も300になります。val1には影響しません

Unboxingの際に参照先がnullの場合は例外が出されます

問題は、Boxing/Unboxingがあまりにシームレスに行われてしまうので、
Unboxingの際のnullアクセスのミスを犯しやすくなるかもしれません。

Boxing演算子&とUnboxing演算子*を導入して

ref4: int* = &val;
val2: int = *ref4;
//(C++に似てますがやってることはちょっと違う)

などとすると注意も促せるかと
(ただし、値型と参照型を同じように扱えなくなるのでtemplateは作りにくくなるかもし得れません)