One use is when you want an open sum type rather than a closed one. For example, you might want users of your library to add their own 'constructors'. Then, they serve a purpose similar to a constructor that takes no arguments:
{-# LANGUAGE EmptyDataDecls #-}
class Color a where
rgb :: a -> (Int, Int, Int)
data Red
data Green
data Blue
instance Color Red where
rgb _ = (255, 0, 0)
instance Color Green where
rgb _ = (0, 255, 0)
instance Color Blue where
rgb _ = (0, 0, 255)
data ColorADT = Color_Red | Color_Green | Color_Blue
rgb_adt Color_Red = (255, 0, 0)
rgb_adt Color_Green = (0, 255, 0)
rgb_adt Color_Blue = (0, 0, 255)