As instance Alternative ZipList is defined since 4.11.0.0:

instance Alternative ZipList where
    empty = ZipList []
    ZipList xs <|> ZipList ys = ZipList (xs ++ drop (length xs) ys)

It seems perfectly fine to make Monoid for ZipList as followings:

instance Semigroup a => Semigroup (ZipList a) where
ZipList [] <> ZipList ys = ZipList ys
ZipList xs <> ZipList [] = ZipList xs
ZipList (x:xs) <> ZipList (y:ys) = ZipList (x <> y : ZipList xs <> ZipList ys)

instance Semigroup a => Monoid (ZipList a) where
mempty = ZipList []


Note that this semantic is similar to that of Maybe​.