diff --git a/CHANGELOG.txt b/CHANGELOG.txt
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,9 @@
+2016-06-28, 0.6.2:
+	Updated dependencies for GHC 8.0.1.
+
+	Added Semigroup instances, bringing in a new dependency on semigroups
+	on pre-8.0 GHC versions.
+
 2015-04-03, 0.6.1:
 	Fixed build on base < 4.8.
 
diff --git a/CREDITS.txt b/CREDITS.txt
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -1,3 +1,4 @@
 davean
 Gregory Crosswhite
 Matti Niemenmaa
+Andrzej Rybczak
diff --git a/Data/ListTrie/Base/Map.hs b/Data/ListTrie/Base/Map.hs
--- a/Data/ListTrie/Base/Map.hs
+++ b/Data/ListTrie/Base/Map.hs
@@ -19,7 +19,7 @@
 import qualified Data.Map    as M
 
 import Prelude hiding ( filter, foldl, foldl1, foldr, foldr1, lookup, null
-                      , mapM, sequence, toList
+                      , mapM, sequence
                       )
 import qualified Prelude
 
diff --git a/Data/ListTrie/Map.hs b/Data/ListTrie/Map.hs
--- a/Data/ListTrie/Map.hs
+++ b/Data/ListTrie/Map.hs
@@ -44,8 +44,10 @@
 import Data.Either         (partitionEithers)
 import Data.Function       (on)
 import qualified Data.Foldable as F
+import qualified Data.List.NonEmpty as NE
 import qualified Data.Maybe as Maybe
 import Data.Monoid         (Monoid(..))
+import Data.Semigroup      (Semigroup(..), stimesIdempotent)
 import Data.Traversable    (Traversable(traverse))
 import Prelude hiding      (filter, foldl, foldr, lookup, map, null)
 import qualified Prelude
@@ -96,9 +98,14 @@
  where
    compare = compare `on` toAscList
 
+instance Map map k => Semigroup (TrieMap map k a) where
+   (<>) = union
+   sconcat = unions . NE.toList
+   stimes = stimesIdempotent
+
 instance Map map k => Monoid (TrieMap map k a) where
    mempty  = empty
-   mappend = union
+   mappend = (<>)
    mconcat = unions
 
 instance Map map k => Functor (TrieMap map k) where
diff --git a/Data/ListTrie/Patricia/Map.hs b/Data/ListTrie/Patricia/Map.hs
--- a/Data/ListTrie/Patricia/Map.hs
+++ b/Data/ListTrie/Patricia/Map.hs
@@ -44,8 +44,10 @@
 import Data.Either         (partitionEithers)
 import Data.Function       (on)
 import qualified Data.Foldable as F
+import qualified Data.List.NonEmpty as NE
 import qualified Data.Maybe as Maybe
 import Data.Monoid         (Monoid(..))
+import Data.Semigroup      (Semigroup(..), stimesIdempotent)
 import Data.Traversable    (Traversable(traverse))
 import Prelude hiding      (filter, foldl, foldr, lookup, map, null)
 import qualified Prelude
@@ -107,9 +109,14 @@
  where
    compare = compare `on` toAscList
 
+instance Map map k => Semigroup (TrieMap map k a) where
+   (<>) = union
+   sconcat = unions . NE.toList
+   stimes = stimesIdempotent
+
 instance Map map k => Monoid (TrieMap map k a) where
    mempty  = empty
-   mappend = union
+   mappend = (<>)
    mconcat = unions
 
 instance Map map k => Functor (TrieMap map k) where
diff --git a/Data/ListTrie/Patricia/Set.hs b/Data/ListTrie/Patricia/Set.hs
--- a/Data/ListTrie/Patricia/Set.hs
+++ b/Data/ListTrie/Patricia/Set.hs
@@ -27,7 +27,9 @@
 import Control.Monad  (liftM3)
 import Data.Binary    (Binary,get,put)
 import Data.Function  (on)
+import qualified Data.List.NonEmpty as NE
 import Data.Monoid    (Monoid(..))
+import Data.Semigroup (Semigroup(..), stimesIdempotent)
 import Prelude hiding (filter, foldl, foldr, map, null)
 import qualified Prelude
 
@@ -101,9 +103,14 @@
  where
    compare = compare `on` unTS
 
+instance Map map a => Semigroup (TrieSet map a) where
+   (<>) = union
+   sconcat = unions . NE.toList
+   stimes = stimesIdempotent
+
 instance Map map a => Monoid (TrieSet map a) where
    mempty  = empty
-   mappend = union
+   mappend = (<>)
    mconcat = unions
 
 instance (Map map a, Show a) => Show (TrieSet map a) where
diff --git a/Data/ListTrie/Set.hs b/Data/ListTrie/Set.hs
--- a/Data/ListTrie/Set.hs
+++ b/Data/ListTrie/Set.hs
@@ -27,7 +27,9 @@
 import Control.Monad  (liftM2)
 import Data.Binary    (Binary,get,put)
 import Data.Function  (on)
+import qualified Data.List.NonEmpty as NE
 import Data.Monoid    (Monoid(..))
+import Data.Semigroup (Semigroup(..), stimesIdempotent)
 import Prelude hiding (filter, foldl, foldr, map, null)
 import qualified Prelude
 
@@ -96,9 +98,14 @@
  where
    compare = compare `on` unTS
 
+instance Map map a => Semigroup (TrieSet map a) where
+   (<>) = union
+   sconcat = unions . NE.toList
+   stimes = stimesIdempotent
+
 instance Map map a => Monoid (TrieSet map a) where
    mempty  = empty
-   mappend = union
+   mappend = (<>)
    mconcat = unions
 
 instance (Map map a, Show a) => Show (TrieSet map a) where
diff --git a/LICENSE.txt b/LICENSE.txt
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -2,7 +2,7 @@
 are held by whoever wrote the code in question: see CREDITS.txt for a list of
 authors.
 
-Copyright (c) 2008-2015 <authors>
+Copyright (c) 2008-2016 <authors>
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/list-tries.cabal b/list-tries.cabal
--- a/list-tries.cabal
+++ b/list-tries.cabal
@@ -1,7 +1,7 @@
-Cabal-Version: >= 1.6
+Cabal-Version: >= 1.9.2
 
 Name:        list-tries
-Version:     0.6.1
+Version:     0.6.2
 Homepage:    http://iki.fi/matti.niemenmaa/list-tries/
 Synopsis:    Tries and Patricia tries: finite sets and maps for list keys
 Category:    Data, Data Structures
@@ -40,16 +40,15 @@
   type: git
   location: https://github.com/Deewiant/list-tries
 
-flag testing
-  description: Enable building a test executable
-  default: False
-
 Library
-   Build-Depends: base       >= 3   && < 4.9
-                , containers >= 0.3 && < 0.6
-                , dlist      >= 0.4 && < 0.8
-                , binary     >= 0.5 && < 0.8
+   Build-Depends: base       >= 3    && < 4.10
+                , containers >= 0.3  && < 0.6
+                , dlist      >= 0.4  && < 0.8
+                , binary     >= 0.5  && < 0.9
 
+   if impl(ghc < 8.0)
+      Build-Depends: semigroups >= 0.18 && < 0.19
+
    Exposed-Modules: Data.ListTrie.Base.Map
                     Data.ListTrie.Map
                     Data.ListTrie.Map.Eq
@@ -75,53 +74,25 @@
 
    Include-Dirs: headers
 
-executable list-tries-tests
-   if !flag(testing)
-      buildable: False
+Test-Suite list-tries-tests
+   type: exitcode-stdio-1.0
 
+   hs-source-dirs: tests
    main-is: Main.hs
-   hs-source-dirs: ., tests
 
-   Build-Depends: base       >= 3   && < 4.9
-                , containers >= 0.3 && < 0.6
-                , dlist      >= 0.4 && < 0.8
-                , binary     >= 0.5 && < 0.8
-
-   if flag(testing)
-     Build-Depends: template-haskell           >= 2.3 && < 2.11
-                  , HUnit                      >= 1.2 && < 1.3
-                  , QuickCheck                 >= 2.1 && < 2.8
-                  , test-framework             >= 0.2 && < 0.9
-                  , test-framework-hunit       >= 0.2 && < 0.4
-                  , test-framework-quickcheck2 >= 0.2 && < 0.4
-                  , ChasingBottoms             >= 1.2 && < 1.4
+   Build-Depends: list-tries
+                , base                       >= 3   && < 4.10
+                , binary                     >= 0.5 && < 0.9
+                , template-haskell           >= 2.3 && < 2.12
+                , HUnit                      >= 1.2 && < 1.3
+                , QuickCheck                 >= 2.1 && < 2.8
+                , test-framework             >= 0.2 && < 0.9
+                , test-framework-hunit       >= 0.2 && < 0.4
+                , test-framework-quickcheck2 >= 0.2 && < 0.4
+                , ChasingBottoms             >= 1.2 && < 1.4
 
-   Other-Modules: Data.ListTrie.Base.Map
-                  Data.ListTrie.Map
-                  Data.ListTrie.Map.Eq
-                  Data.ListTrie.Map.Ord
-                  Data.ListTrie.Map.Enum
-                  Data.ListTrie.Set
-                  Data.ListTrie.Set.Eq
-                  Data.ListTrie.Set.Ord
-                  Data.ListTrie.Set.Enum
-                  Data.ListTrie.Patricia.Map
-                  Data.ListTrie.Patricia.Map.Eq
-                  Data.ListTrie.Patricia.Map.Ord
-                  Data.ListTrie.Patricia.Map.Enum
-                  Data.ListTrie.Patricia.Set
-                  Data.ListTrie.Patricia.Set.Eq
-                  Data.ListTrie.Patricia.Set.Ord
-                  Data.ListTrie.Patricia.Set.Enum
-                  Data.ListTrie.Base
-                  Data.ListTrie.Base.Classes
-                  Data.ListTrie.Base.Map.Internal
-                  Data.ListTrie.Patricia.Base
-                  Data.ListTrie.Util
-                  Tests.Base
+   Other-Modules: Tests.Base
                   Tests.Cases
                   Tests.Properties
                   Tests.Strictness
                   Tests.TH
-
-   Include-Dirs: headers
diff --git a/tests/Tests/Cases.hs b/tests/Tests/Cases.hs
--- a/tests/Tests/Cases.hs
+++ b/tests/Tests/Cases.hs
@@ -23,8 +23,6 @@
 import qualified Data.ListTrie.Patricia.Map.Ord
 import qualified Data.ListTrie.Patricia.Map.Enum
 
-import Data.ListTrie.Util
-
 import Tests.TH
 
 $(makeFunc allTries ["null","empty"] [d|
@@ -143,7 +141,7 @@
           b = fromList $ zip bl [length al..]
        in intersectionWithKey (\k vl vr -> length k - vl + vr) a b
           == fromList (zip ["cat","caterers"] $
-                zipWith3 (join (.:) (+) . negate)
+                zipWith3 (\a b c -> b + c - a)
                          [1..] [length al..] (map length al))
  |])
 $(makeFunc mapsOnly ["fromList","intersectionWithKey"] [d|
