diff --git a/enumset.cabal b/enumset.cabal
--- a/enumset.cabal
+++ b/enumset.cabal
@@ -1,6 +1,5 @@
--- would also be useful as type-safe alternative in wx, wxcore
 Name:             enumset
-Version:          0.0.4
+Version:          0.0.4.1
 License:          BSD3
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -19,12 +18,14 @@
   the @Data.Edison.Coll.EnumSet@ module in the @edison@ package,
   however our implementation allows you to choose the embedding type
   and thus the maximum size of the set.
+  .
+  See also @data-flags@ and @Data.EnumSet@ in @enummapset@.
 Cabal-Version:    >=1.10
-Tested-With:      GHC==6.10.4, GHC==6.12.3
+Tested-With:      GHC==7.4.2, GHC==7.6.3, GHC==8.4.1
 Build-Type:       Simple
 
 Source-Repository this
-  Tag:         0.0.4
+  Tag:         0.0.4.1
   Type:        darcs
   Location:    http://code.haskell.org/~thielema/enumset/
 
@@ -37,6 +38,7 @@
   Build-Depends:
     data-accessor >=0.2.1 && <0.3,
     storable-record >=0.0.1 && <0.1,
+    semigroups >=0.1 && <1.0,
     base >= 4 && <5
 
   GHC-Options:      -Wall
diff --git a/src/Data/EnumSet.hs b/src/Data/EnumSet.hs
--- a/src/Data/EnumSet.hs
+++ b/src/Data/EnumSet.hs
@@ -38,6 +38,7 @@
 import qualified Data.EnumSet.Utility as U
 
 import Data.Monoid (Monoid(mempty, mappend), )
+import Data.Semigroup (Semigroup((<>)), )
 
 import qualified Foreign.Storable.Newtype as Store
 import Foreign.Storable (Storable(sizeOf, alignment, peek, poke), )
@@ -57,9 +58,13 @@
    peek = Store.peek Cons
    poke = Store.poke decons
 
+
+instance (Enum a, Bits w) => Semigroup (T w a) where
+   (<>) = (.|.)
+
 {- |
 Since this data type is intended for constructing flags,
-we choose the set union as mappend.
+we choose the set union as 'mappend'.
 For intersection we would also not have a canonical identity element.
 -}
 instance (Enum a, Bits w) => Monoid (T w a) where
diff --git a/src/Data/FlagSet.hs b/src/Data/FlagSet.hs
--- a/src/Data/FlagSet.hs
+++ b/src/Data/FlagSet.hs
@@ -15,6 +15,7 @@
 import Data.Bits (Bits, (.&.), (.|.), )
 
 import Data.Monoid (Monoid(mempty, mappend, mconcat), )
+import Data.Semigroup (Semigroup((<>)), )
 
 import qualified Foreign.Storable.Newtype as Store
 import Foreign.Storable (Storable(sizeOf, alignment, peek, poke), )
@@ -109,13 +110,16 @@
 maskValue (Mask m) (Value v) = MaskedValue m v
 
 
+instance (Bits w) => Semigroup (MaskedValue w a) where
+   MaskedValue mx vx <> MaskedValue my vy =
+      MaskedValue (mx .|. my) (vx .-. my  .|.  vy)
+
 {- |
 @mappend a b@ means that values stored in @b@ overwrite corresponding values in @a@.
 -}
 instance (Bits w) => Monoid (MaskedValue w a) where
    mempty = MaskedValue empty empty
-   mappend (MaskedValue mx vx) (MaskedValue my vy) =
-      MaskedValue (mx .|. my) (vx .-. my  .|.  vy)
+   mappend = (<>)
 
 
 class Enum a where
