diff --git a/Text/Boomerang/Prim.hs b/Text/Boomerang/Prim.hs
--- a/Text/Boomerang/Prim.hs
+++ b/Text/Boomerang/Prim.hs
@@ -19,6 +19,7 @@
 import Data.Either         (partitionEithers)
 import Data.Function       (on)
 import Data.Monoid         (Monoid(mappend, mempty))
+import qualified Data.Semigroup as SG
 import Text.Boomerang.HStack   ((:-)(..), hdMap, hdTraverse)
 import Text.Boomerang.Pos     (ErrorPosition(..), InitialPosition(..), Pos)
 
@@ -116,14 +117,16 @@
     (composeP (.) pf pg)
     (compose (.) sf sg)
 
+instance SG.Semigroup (Boomerang e tok a b) where
+  ~(Boomerang pf sf) <> ~(Boomerang pg sg) = Boomerang
+    (pf `mplus` pg)
+    (\s -> sf s `mplus` sg s)
+
 instance Monoid (Boomerang e tok a b) where
   mempty = Boomerang
     mzero
     (const mzero)
-
-  ~(Boomerang pf sf) `mappend` ~(Boomerang pg sg) = Boomerang
-    (pf `mplus` pg)
-    (\s -> sf s `mplus` sg s)
+  mappend = (SG.<>)
 
 infixr 9 .~
 -- | Reverse composition, but with the side effects still in left-to-right order.
diff --git a/boomerang.cabal b/boomerang.cabal
--- a/boomerang.cabal
+++ b/boomerang.cabal
@@ -1,5 +1,5 @@
 Name:             boomerang
-Version:          1.4.5.4
+Version:          1.4.5.5
 License:          BSD3
 License-File:     LICENSE
 Author:           jeremy@seereason.com
@@ -15,6 +15,7 @@
 Library
         Build-Depends:    base             >= 4    && < 5,
                           mtl              >= 2.0  && < 2.3,
+                          semigroups       >= 0.16 && < 0.19,
                           template-haskell            < 2.14,
                           text             >= 0.11 && < 1.3
         Exposed-Modules:  Text.Boomerang
