I would expect several classes, corresponding to different methods of Witherable:
class Siftable a m | m -> a where
sift :: (a -> Bool) -> m -> m
default sift :: SiftWithable f => (a -> Bool) -> f a -> f a
sift p = siftWith (\x -> x <$ guard (p x))
class Functor f => SiftWithable f where
siftWith :: (a -> Maybe b) -> f a -> f b
class Siftable a m => SiftableA a m where
siftA :: Applicative g => (a -> g Bool) -> m -> g m
default siftA :: (SiftWithAAble f, Applicative g) => (a -> g Bool) -> f a -> g (f a)
siftA p = siftWithA (\x -> (x <$) . guard <$> p x)
class (Traversable f, SiftWithAble f) => SiftWithAAble f where
siftWithA :: Applicative g => (a -> g (Maybe b)) -> f a -> g (f a)