diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+4.3.5
+
+* Support `Semigroup` being a super-class of `Monoid`
+
 4.3.4
 
 * Increase upper bound on `mmorph`
diff --git a/pipes.cabal b/pipes.cabal
--- a/pipes.cabal
+++ b/pipes.cabal
@@ -1,5 +1,5 @@
 Name: pipes
-Version: 4.3.4
+Version: 4.3.5
 Cabal-Version: >= 1.10
 Build-Type: Simple
 Tested-With: GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1
@@ -51,7 +51,8 @@
         exceptions   >= 0.4     && < 0.9,
         mmorph       >= 1.0.0   && < 1.2,
         mtl          >= 2.2.1   && < 2.3,
-        void         >= 0.4     && < 0.8
+        void         >= 0.4     && < 0.8,
+        semigroups   >= 0.17    && < 0.19
 
     Exposed-Modules:
         Pipes,
diff --git a/src/Pipes.hs b/src/Pipes.hs
--- a/src/Pipes.hs
+++ b/src/Pipes.hs
@@ -63,11 +63,10 @@
     , Foldable
     ) where
 
-import Control.Monad (void)
-import Control.Monad.Catch (MonadThrow(..), MonadCatch(..), MonadMask(..))
+import Control.Monad (void, MonadPlus(mzero, mplus))
+import Control.Monad.Catch (MonadThrow(..), MonadCatch(..))
 import Control.Monad.Except (MonadError(..))
 import Control.Monad.IO.Class (MonadIO(liftIO))
-import Control.Monad (MonadPlus(mzero, mplus))
 import Control.Monad.Reader (MonadReader(..))
 import Control.Monad.State (MonadState(..))
 import Control.Monad.Trans.Class (MonadTrans(lift))
@@ -86,10 +85,8 @@
 import Control.Applicative
 import Data.Foldable (Foldable)
 import Data.Traversable (Traversable(..))
-import Data.Monoid
 #endif
-
-import qualified Control.Monad.Catch
+import Data.Semigroup
 
 -- Re-exports
 import Control.Monad.Morph (MFunctor(hoist), MMonad(embed))
@@ -484,11 +481,17 @@
         loop (Pure    r     ) = Pure r
     {-# INLINE embed #-}
 
+instance (Monad m) => Semigroup (ListT m a) where
+    (<>) = (<|>)
+    {-# INLINE (<>) #-}
+
 instance (Monad m) => Monoid (ListT m a) where
     mempty = empty
     {-# INLINE mempty #-}
+#if !(MIN_VERSION_base(4,11,0))
     mappend = (<|>)
     {-# INLINE mappend #-}
+#endif
 
 instance (MonadState s m) => MonadState s (ListT m) where
     get     = lift  get
diff --git a/src/Pipes/Internal.hs b/src/Pipes/Internal.hs
--- a/src/Pipes/Internal.hs
+++ b/src/Pipes/Internal.hs
@@ -38,7 +38,7 @@
 import Control.Monad.Trans.Class (MonadTrans(lift))
 import Control.Monad.Morph (MFunctor(hoist), MMonad(embed))
 import Control.Monad.Except (MonadError(..))
-import Control.Monad.Catch (MonadThrow(..), MonadCatch(..), MonadMask(..))
+import Control.Monad.Catch (MonadThrow(..), MonadCatch(..))
 import Control.Monad.Reader (MonadReader(..))
 import Control.Monad.State (MonadState(..))
 import Control.Monad.Writer (MonadWriter(..))
@@ -48,10 +48,9 @@
 import Control.Applicative (Alternative(..))
 #else
 import Control.Applicative
-import Data.Monoid
 #endif
+import Data.Semigroup
 
-import qualified Control.Monad.Catch
 import qualified Data.Void
 
 {-| A 'Proxy' is a monad transformer that receives and sends information on both
@@ -121,14 +120,19 @@
         _bind (Pure    r   ) f = f r;
   #-}
 
-instance (Monad m, Monoid r) => Monoid (Proxy a' a b' b m r) where
-    mempty        = Pure mempty
-    mappend p1 p2 = go p1 where
+instance (Monad m, Semigroup r) => Semigroup (Proxy a' a b' b m r) where
+    p1 <> p2 = go p1 where
         go p = case p of
             Request a' fa  -> Request a' (\a  -> go (fa  a ))
             Respond b  fb' -> Respond b  (\b' -> go (fb' b'))
             M          m   -> M (m >>= \p' -> return (go p'))
-            Pure    r1     -> fmap (mappend r1) p2
+            Pure    r1     -> fmap (r1 <>) p2
+
+instance (Monad m, Monoid r, Semigroup r) => Monoid (Proxy a' a b' b m r) where
+    mempty        = Pure mempty
+#if !(MIN_VERSION_base(4,11,0))
+    mappend = (<>)
+#endif
 
 instance MonadTrans (Proxy a' a b' b) where
     lift m = M (m >>= \r -> return (Pure r))
