Option types represent computations that can fail. In order for an option type to be at all useful, you need to be able to actually do computations: take an Option<A> and a function A → B, and get back an Option<B>. That’s exactly what the Functor, Applicative, and Monad instances for the Maybe type in Haskell do.
Here, you’ve just traded one kind of checking (!= null) for another (isDefined). This is more type-safe, to be sure, but has a high legibility cost. There is also no gain in exception safety: NoSuchElementException is not appreciably more meaningful than NullReferenceException.