diff --git a/explicit-exception.cabal b/explicit-exception.cabal
--- a/explicit-exception.cabal
+++ b/explicit-exception.cabal
@@ -1,5 +1,5 @@
 Name:             explicit-exception
-Version:          0.1.9
+Version:          0.1.9.1
 License:          BSD3
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -42,7 +42,7 @@
 Source-Repository this
   type:     darcs
   location: http://code.haskell.org/explicit-exception/
-  tag:      0.1.9
+  tag:      0.1.9.1
 
 Flag buildTests
   description: Build executables that demonstrate some space leaks
@@ -55,6 +55,7 @@
 Library
   Build-Depends:
     transformers >=0.2 && <0.6,
+    semigroups >=0.1 && <1.0,
     deepseq >=1.1 && <1.5
   If impl(jhc)
     Build-Depends:
@@ -117,7 +118,6 @@
 
 Executable ee-writer
   If !flag(buildTests)
-    Buildable: False
     Buildable: False
   GHC-Options: -Wall
   Hs-Source-Dirs: spaceleak
diff --git a/src/Control/Monad/Exception/Asynchronous/Lazy.hs b/src/Control/Monad/Exception/Asynchronous/Lazy.hs
--- a/src/Control/Monad/Exception/Asynchronous/Lazy.hs
+++ b/src/Control/Monad/Exception/Asynchronous/Lazy.hs
@@ -54,6 +54,7 @@
 import Data.Foldable (Foldable, )
 -}
 import Data.Monoid(Monoid, mappend, mempty, )
+import Data.Semigroup (Semigroup((<>)), )
 import Data.Function (const, (.), ($), )
 import Data.Maybe (Maybe(Just, Nothing), maybe, )
 
@@ -207,6 +208,10 @@
 instance (NFData e, NFData a) => NFData (Exceptional e a) where
    rnf (Exceptional e a) = rnf (e, a)
 
+instance Monoid a => Semigroup (Exceptional e a) where
+   Exceptional ea a <> Exceptional eb b =
+      Exceptional (mplus ea eb) (mappend a (maybe b (const mempty) ea))
+
 {- |
 'mappend' must be strict in order to fulfill the Monoid laws
 @mappend mempty a = a@ and @mappend a mempty = a@ for @a=undefined@.
@@ -214,8 +219,7 @@
 instance Monoid a => Monoid (Exceptional e a) where
    mempty = pure mempty
 --   mappend = append
-   mappend (Exceptional ea a) (Exceptional eb b) =
-      Exceptional (mplus ea eb) (mappend a (maybe b (const mempty) ea))
+   mappend = (<>)
 
 
 {- | construct Exceptional constructor lazily -}
@@ -392,11 +396,14 @@
    fmap f (ExceptionalT x) =
       ExceptionalT (fmap (fmap f) x)
 
-instance (Monad m, Monoid a) => Monoid (ExceptionalT e m a) where
-   mempty = ExceptionalT $ return mempty
-   mappend x y =
+instance (Monad m, Monoid a) => Semigroup (ExceptionalT e m a) where
+   x <> y =
       ExceptionalT $
       appendM (runExceptionalT x) (runExceptionalT y)
+
+instance (Monad m, Monoid a) => Monoid (ExceptionalT e m a) where
+   mempty = ExceptionalT $ return mempty
+   mappend = (<>)
 
 {-
 instance Applicative m => Applicative (ExceptionalT e m) where
diff --git a/src/Control/Monad/Exception/Asynchronous/Strict.hs b/src/Control/Monad/Exception/Asynchronous/Strict.hs
--- a/src/Control/Monad/Exception/Asynchronous/Strict.hs
+++ b/src/Control/Monad/Exception/Asynchronous/Strict.hs
@@ -54,6 +54,7 @@
 import Data.Foldable (Foldable, )
 -}
 import Data.Monoid(Monoid, mappend, mempty, )
+import Data.Semigroup (Semigroup((<>)), )
 import Data.Function (const, (.), ($), )
 import Data.Maybe (Maybe(Just, Nothing), maybe, )
 
@@ -201,6 +202,10 @@
 instance (NFData e, NFData a) => NFData (Exceptional e a) where
    rnf (Exceptional e a) = rnf (e, a)
 
+instance Monoid a => Semigroup (Exceptional e a) where
+   Exceptional ea a <> Exceptional eb b =
+      Exceptional (mplus ea eb) (mappend a (maybe b (const mempty) ea))
+
 {- |
 'mappend' must be strict in order to fulfill the Monoid laws
 @mappend mempty a = a@ and @mappend a mempty = a@ for @a=undefined@.
@@ -208,8 +213,7 @@
 instance Monoid a => Monoid (Exceptional e a) where
    mempty = pure mempty
 --   mappend = append
-   mappend (Exceptional ea a) (Exceptional eb b) =
-      Exceptional (mplus ea eb) (mappend a (maybe b (const mempty) ea))
+   mappend = (<>)
 
 
 {- | construct Exceptional constructor lazily -}
@@ -372,11 +376,14 @@
    fmap f (ExceptionalT x) =
       ExceptionalT (fmap (fmap f) x)
 
-instance (Monad m, Monoid a) => Monoid (ExceptionalT e m a) where
-   mempty = ExceptionalT $ return mempty
-   mappend x y =
+instance (Monad m, Monoid a) => Semigroup (ExceptionalT e m a) where
+   x <> y =
       ExceptionalT $
       appendM (runExceptionalT x) (runExceptionalT y)
+
+instance (Monad m, Monoid a) => Monoid (ExceptionalT e m a) where
+   mempty = ExceptionalT $ return mempty
+   mappend = (<>)
 
 {-
 instance Applicative m => Applicative (ExceptionalT e m) where
