Why the "almost"? They are all monads (I suppose you meant list comprehensions)
One thing to note is that lists have two natural monads (kinda). One is the usual List monad in Haskell (which does the same thing as list comprehension), but the other is actually an almost monad like your point (3)! So Haskell solves this by defining the "other" monad with a newtype over lists (called ZipList), and actually gives it only an Applicative interface (which is like monad, but with a restricted comprehension - values can't depend on past values so it has no "memory")
This happens with integers in a more honest way, they have two "natural" implementations of monoids (actually infinite, but two stand out): you can add integers and you can multiply integers. In this case Haskell decided to not implement Monoid directly because one is not "more natural" than the other, but instead gives two newtypes, Sum and Product