diff --git a/monoid-transformer.cabal b/monoid-transformer.cabal
--- a/monoid-transformer.cabal
+++ b/monoid-transformer.cabal
@@ -1,5 +1,5 @@
 Name:             monoid-transformer
-Version:          0.0.3
+Version:          0.0.4
 License:          BSD3
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -25,11 +25,13 @@
 Source-Repository this
   type:     darcs
   location: http://code.haskell.org/~thielema/monoid/
-  tag:      0.0.3
+  tag:      0.0.4
 
 
 Library
-  Build-Depends: base >= 1 && <5
+  Build-Depends:
+    semigroups >=0.1 && <1.0,
+    base >= 1 && <5
 
   GHC-Options:      -Wall
   Hs-Source-Dirs:   src
diff --git a/src/Data/Monoid/Applicative.hs b/src/Data/Monoid/Applicative.hs
--- a/src/Data/Monoid/Applicative.hs
+++ b/src/Data/Monoid/Applicative.hs
@@ -4,12 +4,16 @@
 
 import Control.Applicative (Applicative, pure, liftA2, )
 import Data.Monoid (Monoid, mempty, mappend, )
+import Data.Semigroup (Semigroup, (<>), )
 
 {- |
 Sequence applicative functors and combine their functorial results with 'mappend'.
 -}
 newtype T f a = Cons {run :: f a}
 
+
+instance (Applicative f, Semigroup a) => Semigroup (T f a) where
+   Cons x <> Cons y = Cons $ liftA2 (<>) x y
 
 instance (Applicative f, Monoid a) => Monoid (T f a) where
    mempty = Cons $ pure mempty
diff --git a/src/Data/Monoid/Monad.hs b/src/Data/Monoid/Monad.hs
--- a/src/Data/Monoid/Monad.hs
+++ b/src/Data/Monoid/Monad.hs
@@ -4,6 +4,7 @@
 
 import Control.Monad (liftM2, )
 import Data.Monoid (Monoid, mempty, mappend, )
+import Data.Semigroup (Semigroup, (<>), )
 
 {- |
 Sequence actions and combine their monadic results with 'mappend'.
@@ -12,6 +13,9 @@
 -}
 newtype T m a = Cons {run :: m a}
 
+
+instance (Monad m, Semigroup a) => Semigroup (T m a) where
+   Cons x <> Cons y = Cons $ liftM2 (<>) x y
 
 instance (Monad m, Monoid a) => Monoid (T m a) where
    mempty = Cons $ return mempty
diff --git a/src/Data/Monoid/MonadicEndo.hs b/src/Data/Monoid/MonadicEndo.hs
--- a/src/Data/Monoid/MonadicEndo.hs
+++ b/src/Data/Monoid/MonadicEndo.hs
@@ -1,6 +1,7 @@
 module Data.Monoid.MonadicEndo where
 
 import Data.Monoid (Monoid, mempty, mappend, )
+import Data.Semigroup (Semigroup, (<>), )
 
 {- |
 Like Data.Monoid.Endo but with monadic result.
@@ -11,8 +12,11 @@
 newtype T m a = Cons {run :: a -> m a}
 
 
-instance Monad m => Monoid (T m a) where
-   mempty = Cons return
-   mappend (Cons x) (Cons y) =
+instance Monad m => Semigroup (T m a) where
+   Cons x <> Cons y =
       Cons $ (x =<<) . y
 --      Cons $ x <=< y
+
+instance Monad m => Monoid (T m a) where
+   mempty = Cons return
+   mappend = (<>)
diff --git a/src/Data/Monoid/Reader.hs b/src/Data/Monoid/Reader.hs
--- a/src/Data/Monoid/Reader.hs
+++ b/src/Data/Monoid/Reader.hs
@@ -2,6 +2,7 @@
 
 import qualified Data.Monoid.Transformer as MonoidTrans
 import Data.Monoid (Monoid, mempty, mappend, )
+import Data.Semigroup (Semigroup, (<>), )
 import Data.Functor (Functor, fmap, )
 import Data.Function (const, ($), (.), )
 
@@ -15,6 +16,9 @@
 
 pure :: a -> T r a
 pure = Cons . const
+
+instance Semigroup a => Semigroup (T r a) where
+   Cons x <> Cons y = Cons $ \r -> x r <> y r
 
 instance Monoid a => Monoid (T r a) where
    mempty = MonoidTrans.lift mempty
diff --git a/src/Data/Monoid/State.hs b/src/Data/Monoid/State.hs
--- a/src/Data/Monoid/State.hs
+++ b/src/Data/Monoid/State.hs
@@ -2,6 +2,7 @@
 
 import qualified Data.Monoid.Transformer as MonoidTrans
 import Data.Monoid (Monoid, mempty, mappend, )
+import Data.Semigroup (Semigroup, (<>), )
 import Data.Functor (Functor, fmap, )
 import Data.Function (const, ($), (.), )
 import Data.Tuple (fst, snd, )
@@ -38,6 +39,13 @@
 modify :: Monoid a => (s -> s) -> T s a
 modify f = Cons $ \s -> (mempty, f s)
 
+
+instance Semigroup a => Semigroup (T s a) where
+   Cons x <> Cons y =
+      Cons $ \s0 ->
+         let (xr,s1) = x s0
+             (yr,s2) = y s1
+         in  (xr<>yr, s2)
 
 instance Monoid a => Monoid (T s a) where
    mempty = MonoidTrans.lift mempty
