Using customPostVariableTypes isn't an option, since the out-of the-box serializable will still be chosen first. I made the following modification to SerializableVariableType.isAbleToStore() so that the appropriate type from the basic set is still invoked on basic types. Not elegant, but it works.
boolean isAbleToStore(Object value) {
if (value==null) {
return false;
}
Class theclass = value.getClass();
boolean isAssignable = (
byte[].class.isAssignableFrom(theclass)
|| String.class.isAssignableFrom(value.getClass())
|| Boolean.class.isAssignableFrom(value.getClass())
|| boolean.class.isAssignableFrom(value.getClass())
|| Short.class.isAssignableFrom(value.getClass())
|| short.class.isAssignableFrom(value.getClass())
|| Integer.class.isAssignableFrom(value.getClass())
|| int.class.isAssignableFrom(value.getClass())
|| Long.class.isAssignableFrom(value.getClass())
|| long.class.isAssignableFrom(value.getClass())
|| Date.class.isAssignableFrom(value.getClass())
|| Double.class.isAssignableFrom(value.getClass())
|| ItemInstance.class.isAssignableFrom(theclass)
|| MessageInstance.class.isAssignableFrom(theclass)
);
return (!isAssignable && value instanceof Serializable);
}