diff --git a/src/Data/Type/Map.hs b/src/Data/Type/Map.hs
--- a/src/Data/Type/Map.hs
+++ b/src/Data/Type/Map.hs
@@ -98,6 +98,12 @@
 instance (KnownSymbol k, Show v, Show' (Map s)) => Show' (Map ((k :-> v) ': s)) where
     show' (Ext k v s) = ", " ++ show k ++ " :-> " ++ show v ++ (show' s)
 
+instance Eq (Map '[]) where
+    Empty == Empty = True
+
+instance (KnownSymbol k, Eq (Var k), Eq v, Eq (Map s)) => Eq (Map ((k :-> v) ': s)) where
+    (Ext k v m) == (Ext k' v' m') = k == k' && v == v' && m == m'
+
 {-| Union of two finite maps -}
 union :: (Unionable s t) => Map s -> Map t -> Map (Union s t)
 union s t = nub (quicksort (append s t))
diff --git a/src/Data/Type/Set.hs b/src/Data/Type/Set.hs
--- a/src/Data/Type/Set.hs
+++ b/src/Data/Type/Set.hs
@@ -34,6 +34,10 @@
 instance (Show' (Set s), Show e) => Show' (Set (e ': s)) where
     show' (Ext e s) = ", " ++ show e ++ (show' s)
 
+instance (Eq e, Eq (Set s)) => Eq (Set (e ': s)) where
+    (Ext e m) == (Ext e' m') = e == e' && m == m'
+
+
 {-| At the type level, normalise the list form to the set form -}
 type AsSet s = Nub (Sort s)
 
diff --git a/type-level-sets.cabal b/type-level-sets.cabal
--- a/type-level-sets.cabal
+++ b/type-level-sets.cabal
@@ -1,65 +1,67 @@
 name:                   type-level-sets
-version:                0.7
+version:                0.8.0.0
 synopsis:               Type-level sets and finite maps (with value-level counterparts)
-description:            
-   This package provides type-level sets (no duplicates, sorted to provide a normal form) via 'Set' and type-level
-   finite maps via 'Map', with value-level counterparts.
-   .
-   Described in the paper \"Embedding effect systems in Haskell\" by Dominic Orchard 
-   and Tomas Petricek <http://www.cl.cam.ac.uk/~dao29/publ/haskell14-effects.pdf> (Haskell Symposium, 2014). This version now uses Quicksort to normalise the representation.	
-   .
-   Here is a brief example for finite maps: 
-   .
-   >
-   > import Data.Type.Map
-   >
-   > -- Specify how to combine duplicate key-value pairs for Int values
-   > type instance Combine Int Int = Int
-   > instance Combinable Int Int where
-   >     combine x y = x + y
-   >
-   > foo :: Map '["x" :-> Int, "z" :-> Bool, "w" :-> Int]
-   > foo = Ext (Var :: (Var "x")) 2 
-   >     $ Ext (Var :: (Var "z")) True 
-   >     $ Ext (Var :: (Var "w")) 5 
-   >     $ Empty 
-   >
-   > bar :: Map '["y" :-> Int, "w" :-> Int]
-   > bar = Ext (Var :: (Var "y")) 3
-   >     $ Ext (Var :: (Var "w")) 1
-   >     $ Empty
-   >  
-   > -- foobar :: Map '["w" :-> Int, "x" :-> Int, "y" :-> Int, "z" :-> Bool]
-   > foobar = foo `union` bar
-   .
-   The 'Map' type for 'foobar' here shows the normalised form (sorted with no duplicates).
-   The type signatures is commented out as it can be infered. Running the example we get:
-   .
-   > >>> foobar	
-   > {w :-> 6, x :-> 2, y :-> 3, z :-> True}
-   .
-   Thus, we see that the values for \"w\" are added together. 
-   For sets, here is an example:
-   .
-   > import GHC.TypeLits
-   > import Data.Type.Set
-   > type instance Cmp (Natural n) (Natural m) = CmpNat n m
-   >
-   > data Natural (a :: Nat) where
-   >   Z :: Natural 0
-   >   S :: Natural n -> Natural (n + 1)
-   > 
-   > -- foo :: Set '[Natural 0, Natural 1, Natural 3]
-   > foo = asSet $ Ext (S Z) (Ext (S (S (S Z))) (Ext Z Empty))
-   >
-   > -- bar :: Set '[Natural 1, Natural 2]
-   > bar = asSet $ Ext (S (S Z)) (Ext (S Z) (Ext (S Z) Empty))
-   >
-   > -- foobar :: Set '[Natural 0, Natural 1, Natural 2, Natural 3]
-   > foobar = foo `union` bar
-   .
-   Note the types here are all inferred.
-   .
+description:            This package provides type-level sets (no duplicates, sorted to provide a normal form) via 'Set' and type-level finite maps via 'Map', with value-level counterparts.
+                        .
+                        Described in the paper "Embedding effect systems in Haskell" by Dominic Orchard and Tomas Petricek <http://www.cl.cam.ac.uk/~dao29/publ/haskell14-effects.pdf> (Haskell Symposium, 2014). This version now uses Quicksort to normalise the representation.
+                        .
+                        Here is a brief example for finite maps: 
+                        .
+                        @
+                         import Data.Type.Map
+                         .
+                         -- Specify how to combine duplicate key-value pairs for Int values
+                         type instance Combine Int Int = Int
+                         instance Combinable Int Int where
+                             combine x y = x + y
+                         .
+                         foo :: Map '["x" :-> Int, "z" :-> Bool, "w" :-> Int]
+                         foo = Ext (Var :: (Var "x")) 2 
+                             $ Ext (Var :: (Var "z")) True 
+                             $ Ext (Var :: (Var "w")) 5 
+                             $ Empty 
+                         .
+                         bar :: Map '["y" :-> Int, "w" :-> Int]
+                         bar = Ext (Var :: (Var "y")) 3
+                             $ Ext (Var :: (Var "w")) 1
+                             $ Empty
+                         .  
+                         -- foobar :: Map '["w" :-> Int, "x" :-> Int, "y" :-> Int, "z" :-> Bool]
+                         foobar = foo `union` bar
+                         .
+                        @
+                        .
+                        The 'Map' type for 'foobar' here shows the normalised form (sorted with no duplicates). The type signatures is commented out as it can be infered. Running the example we get:
+                        .
+                        @
+                         > >>> foobar	
+                         > {w :-> 6, x :-> 2, y :-> 3, z :-> True}
+                        @
+                        .
+                        Thus, we see that the values for \"w\" are added together.
+                        .
+                        For sets, here is an example:
+                        .
+                        @
+                         import GHC.TypeLits
+                         import Data.Type.Set
+                         type instance Cmp (Natural n) (Natural m) = CmpNat n m
+                         .
+                         data Natural (a :: Nat) where
+                             Z :: Natural 0
+                             S :: Natural n -> Natural (n + 1)
+                         .
+                         -- foo :: Set '[Natural 0, Natural 1, Natural 3]
+                         foo = asSet $ Ext (S Z) (Ext (S (S (S Z))) (Ext Z Empty))
+                         .
+                         -- bar :: Set '[Natural 1, Natural 2]
+                         bar = asSet $ Ext (S (S Z)) (Ext (S Z) (Ext (S Z) Empty))
+                         .
+                         -- foobar :: Set '[Natural 0, Natural 1, Natural 2, Natural 3]
+                         foobar = foo `union` bar
+                         .
+                       @
+                       Note the types here are all inferred.
 license:                BSD3
 license-file:           LICENSE
 category:               Type System, Data Structures
@@ -69,7 +71,7 @@
 stability:              experimental
 build-type:             Simple
 cabal-version:          >= 1.6
-tested-with:            GHC == 7.10.3
+tested-with:            GHC >= 8.0.1
 
 extra-source-files:     example.hs, example2.hs
 
