他に動的言語で問題になるのは
n = 1
n = [] if rand(2)==0

とかだろけど、こういうのもやっぱソースファイルと行数をメモって
既存の型から変更されたらその都度ログ出力させるしかないと思う

やはり出来るとはいっても、基本的にあとから変数の型を変えるという処理はやるべきじゃないんだろ
特に一番どうにかしたほうがいいのは
obj.foo
とかやったときにobjがなんらかの要因によって型がnilになってるときにでるエラーだ
一度nil以外のオブジェクトが格納された変数が、再びnilになったらなんらかのエラーをだすべき

つうか、ユーザーが扱えるnilと言語処理系側で扱うnilは区別しなくちゃダメだろ
ユーザーがnilの代わりにfalseを扱うのでもいいけどさぁ
一度nil以外が格納されたオブジェクトに、falseの代入は許しても、次にnilが格納されたら何かあっても良いと思うよ
そもそも
obj というオブジェクトを生成したのちに
if obj  という式において偽という結果が欲しいのであれば
obj = nil とするのではなく obj.vardelete とかやって変数を消滅させて
それ以降にobj.foo とかいう記述があったらエラーくらいだすべき