Well, "try" is really doing two things: chaining Maybes, and then adding a monadic context:
try :: Monad m => m (Maybe a) -> m (Maybe a) -> m (Maybe a)
try = liftM2 (<|>)
(You could weaken the assumption by using (Applicative m) instead)
"tries" is similar, only there is an intermediate "threading" step [m x] -> m [x]:
tries :: Monad m => [m (Maybe a)] -> m (Maybe a)
tries = liftM asum . sequence
These are both special cases, they only rely on Maybe being an Alternative:
try :: (Monad m, Alternative f) => m (f a) -> m (f a) -> m (f a)
tries :: (Monad m, Alternative f) => [m (f a)] -> m (f a)
If you *really* want to generalise you can even write this. ([] is also an unnecessary specialisation right?:))