The problem here is that Nullable!T is not a real type. Hence,
Nullable!int is actually
Algebraic!(int,void*). Checking for that apparently does not work as
simply as one might
hope.

Algebraic is also an alias for VariantN (which is real type):
template Algebraic(T...)
{
alias VariantN!(maxSize!(T), T) Algebraic;
}
however this check also yields false:
static if (is(T X == VariantN!(U), U...))
but this works:
static if (is(T == Nullable!int))
so, I was a bit confused...
So, instead you should create a wrapper. This works: