diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Revision history for wild-bind
 
+## 0.1.2.0  -- 2018-04-10
+
+* Add `Semigroup` instance to `Binding` and `SeqBinding`.
+* Confirmed test with `base-4.11`.
+
+
 ## 0.1.1.1  -- 2018-03-14
 
 * Confirmed test with `hspec-2.5.0`.
diff --git a/src/WildBind/Binding.hs b/src/WildBind/Binding.hs
--- a/src/WildBind/Binding.hs
+++ b/src/WildBind/Binding.hs
@@ -80,6 +80,7 @@
 import Control.Monad.Trans.Writer (Writer, tell, execWriter, mapWriter)
 import qualified Data.Map as M
 import Data.Monoid (Monoid(..), Endo(Endo, appEndo))
+import Data.Semigroup (Semigroup(..))
 
 import WildBind.Description (ActionDescription)
 
@@ -160,6 +161,13 @@
 -- front-end state type, and @i@ is the input type.
 type Binding s i = Binding' () s i
 
+-- | See "Monoid" instance.
+instance Ord i => Semigroup (Binding' bs fs i) where
+  abind <> bbind = Binding' $ \bs fs ->
+    let amap = mapActResult (<> bbind) $ unBinding' abind bs fs
+        bmap = mapActResult (abind <>) $ unBinding' bbind bs fs
+    in M.unionWith (\_ b -> b) amap bmap
+
 -- | 'mempty' returns a 'Binding' where no binding is
 -- defined. 'mappend' combines two 'Binding's while preserving their
 -- individual implicit states. The right-hand 'Binding' has precedence
@@ -168,10 +176,7 @@
 -- the binding from the right-hand one is used.
 instance Ord i => Monoid (Binding' bs fs i) where
   mempty = noBinding
-  mappend abind bbind = Binding' $ \bs fs ->
-    let amap = mapActResult (`mappend` bbind) $ unBinding' abind bs fs
-        bmap = mapActResult (abind `mappend`) $ unBinding' bbind bs fs
-    in M.unionWith (\_ b -> b) amap bmap
+  mappend = (<>)
 
 -- | A 'Binding'' with no bindings. It's the same as 'mempty', except
 -- 'noBinding' requires no context.
diff --git a/src/WildBind/Seq.hs b/src/WildBind/Seq.hs
--- a/src/WildBind/Seq.hs
+++ b/src/WildBind/Seq.hs
@@ -27,7 +27,8 @@
 
 import Control.Monad.Trans.State (State)
 import qualified Control.Monad.Trans.State as State
-import Data.Monoid (Monoid(..), (<>), mconcat)
+import Data.Monoid (Monoid(..), mconcat)
+import Data.Semigroup (Semigroup(..))
 
 import WildBind.Binding
   ( Binding, Binding', binds', whenBack, on, as, run, extend,
@@ -39,10 +40,14 @@
 newtype SeqBinding fs i = SeqBinding ([i] -> Binding' [i] fs i)
 
 -- | Follows the same rule as 'Binding'.
+instance Ord i => Semigroup (SeqBinding fs i) where
+  (SeqBinding a) <> (SeqBinding b) =
+    SeqBinding $ \ps -> mappend (a ps) (b ps)
+
+-- | Follows the same rule as 'Binding'.
 instance Ord i => Monoid (SeqBinding fs i) where
   mempty = SeqBinding $ const mempty
-  mappend (SeqBinding a) (SeqBinding b) =
-    SeqBinding $ \ps -> mappend (a ps) (b ps)
+  mappend = (<>)
 
 -- | Prepend prefix keys to the 'SeqBinding'.
 --
diff --git a/wild-bind.cabal b/wild-bind.cabal
--- a/wild-bind.cabal
+++ b/wild-bind.cabal
@@ -1,5 +1,5 @@
 name:                   wild-bind
-version:                0.1.1.1
+version:                0.1.2.0
 author:                 Toshio Ito <debug.ito@gmail.com>
 maintainer:             Toshio Ito <debug.ito@gmail.com>
 license:                BSD3
@@ -26,10 +26,11 @@
                         WildBind.Input.NumPad,
                         WildBind.Seq
   -- other-modules:        
-  build-depends:        base >=4.6 && <5.0,
+  build-depends:        base >=4.6 && <4.12,
                         text >=1.2.0 && <1.3,
                         containers >=0.5.0 && <0.6,
-                        transformers >=0.3.0 && <0.6
+                        transformers >=0.3.0 && <0.6,
+                        semigroups >=0.16.2.2 && <0.19
 
 -- executable wild-bind
 --   default-language:     Haskell2010
