diff --git a/machinecell.cabal b/machinecell.cabal
--- a/machinecell.cabal
+++ b/machinecell.cabal
@@ -1,13 +1,13 @@
 name:                machinecell
-version:             4.0.0
+version:             4.0.1
 synopsis:            Arrow based stream transducers
 license:             BSD3
 license-file:        LICENSE
 author:              Hidenori Azuma
 maintainer:          Hidenori Azuma <as.capabl@gmail.com>
-stability:     	     experimental
-homepage:   	     http://github.com/as-capabl/machinecell
-bug-reports:   	     http://github.com/as-capabl/machinecell/issues
+stability:              experimental
+homepage:            http://github.com/as-capabl/machinecell
+bug-reports:            http://github.com/as-capabl/machinecell/issues
 copyright:           Copyright (c) 2014 Hidenori Azuma
 category:            Control, FRP, Reactivity
 build-type:          Simple
@@ -15,12 +15,12 @@
 cabal-version:       >=1.10
 
 description:
-	Stream processing library similar to pipes, couduit, or machines.
-	.
-	Arrow combinatins are supported and can be used with the arrow notation.
-	AFRP-like utilities are also available.
-	.
-	A quick introduction is available in the Control.Arrow.Machine documentation.
+    Stream processing library similar to pipes, couduit, or machines.
+    .
+    Arrow combinatins are supported and can be used with the arrow notation.
+    AFRP-like utilities are also available.
+    .
+    A quick introduction is available in the Control.Arrow.Machine documentation.
 
 flag arrow-tr
   description:
@@ -42,7 +42,7 @@
         Control.Arrow.Machine.Misc.Discrete
   other-extensions:    FlexibleInstances, Arrows, RankNTypes, TypeSynonymInstances, MultiParamTypeClasses, GADTs, FlexibleContexts, NoMonomorphismRestriction, RecursiveDo
   ghc-options: -Wall
-  build-depends:       base >=4.7.0.0 && <5.0, mtl >=2.2.1 && <3, free >=4.12.3 && <5, semigroups >=0.18.1 && <1, profunctors >=5.2 && <6, transformers >=0.5.0.0 && <1
+  build-depends:       base >=4.8 && <5.0, mtl >=2.2.1 && <3, free >=4.12.3 && <5.1, semigroups >=0.18.1 && <1, profunctors >=5.2 && <6, transformers >=0.5.0.0 && <1
   hs-source-dirs:      src
   default-language:    Haskell2010
 
@@ -74,11 +74,11 @@
   Build-depends:       base >=4.0 && <5.0, doctest >=0.3.0
 
 source-repository head
-  type:		git
-  location:	https://github.com/as-capabl/machinecell.git
-  branch:	master
+  type:        git
+  location:    https://github.com/as-capabl/machinecell.git
+  branch:      master
 
 source-repository this
-  type:		git
-  location:	https://github.com/as-capabl/machinecell.git
-  tag:		release-4.0.0
+  type:        git
+  location:    https://github.com/as-capabl/machinecell.git
+  tag:         release-4.0.1
diff --git a/src/Control/Arrow/Machine/Types.hs b/src/Control/Arrow/Machine/Types.hs
--- a/src/Control/Arrow/Machine/Types.hs
+++ b/src/Control/Arrow/Machine/Types.hs
@@ -123,7 +123,7 @@
 import Control.Applicative
 import qualified Data.Foldable as Fd
 import Data.Traversable as Tv
-import Data.Semigroup (Semigroup, (<>))
+import Data.Semigroup (Semigroup ((<>)))
 import Data.Maybe (fromMaybe, isNothing, isJust)
 import qualified Control.Monad.Trans.Free.Church as F
 import GHC.Exts (build)
@@ -135,15 +135,20 @@
 data Phase = Feed | Sweep | Suspend deriving (Eq, Show)
 
 instance
+    Semigroup Phase
+  where
+    (<>) Feed _ = Feed
+    (<>) _ Feed = Feed
+    (<>) Suspend _ = Suspend
+    (<>) _ Suspend = Suspend
+    (<>) Sweep Sweep = Sweep
+
+instance
     Monoid Phase
   where
     mempty = Sweep
 
-    mappend Feed _ = Feed
-    mappend _ Feed = Feed
-    mappend Suspend _ = Suspend
-    mappend _ Suspend = Suspend
-    mappend Sweep Sweep = Sweep
+    mappend = (<>)
 
 
 type ProcType a b c = ProcessT a b c
@@ -375,6 +380,11 @@
     pf <*> px = (pf &&& px) >>> arr (uncurry ($))
 
 instance
+    (Monad m, Semigroup o) => Semigroup (ProcessT m i o)
+  where
+    (<>) = liftA2 (<>)
+
+instance
     (Monad m, Monoid o) => Monoid (ProcessT m i o)
   where
     mempty = pure mempty
@@ -552,17 +562,20 @@
 
 
 instance
+    Semigroup a => Semigroup (Event a)
+  where
+    Event x <> Event y = Event (x <> y)
+    Event x <> _ = Event x
+    _ <> Event y = Event y
+    NoEvent <> _ = NoEvent
+    _ <> NoEvent = NoEvent
+    _ <> _ = End
+
+instance
     Semigroup a => Monoid (Event a)
   where
     mempty = End
-    Event x `mappend` Event y = Event (x <> y)
-    Event x `mappend` _ = Event x
-    _ `mappend` Event y = Event y
-    NoEvent `mappend` _ = NoEvent
-    _ `mappend` NoEvent = NoEvent
-    _ `mappend` _ = End
-
-
+    mappend = (<>)
 
 -- | Signals that can be absent(`NoEvent`) or end.
 -- For composite structure, `collapse` can be defined as monoid sum of all member occasionals.
@@ -605,6 +618,11 @@
 end = burst End
 
 data ZeroEvent = ZeroEvent deriving (Eq, Show, Enum, Bounded)
+
+instance
+    Semigroup ZeroEvent
+  where
+    _ <> _ = ZeroEvent
 
 instance
     Monoid ZeroEvent
