I think it's close enough for government work. The problem cases happen when somebody passes DOUBLE_NULL or NULL_STRING_OR_VARBINARY to an integer field and we take it. The presumably desirable cases is converting INTEGER_NULL to BIGINT_NULL, etc...

We could add still more code to decide which cases are ok, but converting freely between nulls seems like a small enough problem to me. Disagree?