Sounds ok, but I'd recommend a near-future refactor of how options are stored in the mOptions array. It looks like both loading from the old user_options field and the user_properties table now jump through some hoops to include default options in the array; it might be cleaner to keep an array of the live/saved preferences, and fill in defaults on demand in getOption().
The problem I fixed was occurring when using the getOptions() (plural) getter, which returns an array of all options and their values. There's code assuming that all defined preferences will be present in that array (and rightly so, IMO), but for users with incomplete preference sets loaded from user_options, that was not the case. Filling in defaults dynamically in getOption() won't address that.
Sounds good for now then :D +1