diff --git a/Language/Haskell/Preprocessor.hs b/Language/Haskell/Preprocessor.hs
--- a/Language/Haskell/Preprocessor.hs
+++ b/Language/Haskell/Preprocessor.hs
@@ -36,6 +36,17 @@
                    syntaxerror :: Maybe (E.Error -> IO ())
                  }
 
+instance Semigroup Extension where
+  e1 <> e2 = Extension {
+               keywords    = keywords e1 ++ keywords e2,
+               transformer = transformer e1 <=< transformer e2,
+               synspec     = synspec e1 `mappend` synspec e2,
+               usage       = usage e1       <+ usage e2,
+               syntaxerror = syntaxerror e1 <+ syntaxerror e2
+             }
+    where Just a  <+ _ = Just a
+          Nothing <+ b = b
+
 instance Monoid Extension where
   mempty          = Extension {
                       keywords    = [],
@@ -44,15 +55,6 @@
                       usage       = Nothing,
                       syntaxerror = Nothing
                     }
-  e1 `mappend` e2 = Extension {
-                      keywords    = keywords e1 ++ keywords e2,
-                      transformer = transformer e1 <=< transformer e2,
-                      synspec     = synspec e1 `mappend` synspec e2,
-                      usage       = usage e1       <+ usage e2,
-                      syntaxerror = syntaxerror e1 <+ syntaxerror e2
-                    }
-    where Just a  <+ _ = Just a
-          Nothing <+ b = b
 
 base :: Extension
 base  = Extension {
diff --git a/Language/Haskell/Preprocessor/SynSpec.hs b/Language/Haskell/Preprocessor/SynSpec.hs
--- a/Language/Haskell/Preprocessor/SynSpec.hs
+++ b/Language/Haskell/Preprocessor/SynSpec.hs
@@ -13,18 +13,20 @@
                }
   deriving (Eq, Show)
 
+instance Semigroup SynSpec where
+  s1 <> s2 = SynSpec {
+               unboxed   = unboxed s1   || unboxed s2,
+               pragmas   = pragmas s1   || pragmas s2,
+               levelnest = levelnest s1 || levelnest s2,
+               blocks    = blocks s1    ++ blocks s2
+             }
+
 instance Monoid SynSpec where
   mempty          = SynSpec {
                       unboxed   = False,
                       pragmas   = False,
                       levelnest = False,
                       blocks    = []
-                    }
-  s1 `mappend` s2 = SynSpec {
-                      unboxed   = unboxed s1   || unboxed s2,
-                      pragmas   = pragmas s1   || pragmas s2,
-                      levelnest = levelnest s1 || levelnest s2,
-                      blocks    = blocks s1    ++ blocks s2
                     }
 
 data Keyword = I { getKey :: String }
diff --git a/preprocessor-tools.cabal b/preprocessor-tools.cabal
--- a/preprocessor-tools.cabal
+++ b/preprocessor-tools.cabal
@@ -1,16 +1,16 @@
 Name:           preprocessor-tools
-Version:        1.0.1
+Version:        2.0.0
 Cabal-Version:  >= 1.2.3
 License:        BSD3
 License-File:   LICENSE
 Stability:      experimental
-Author:         Jesse A. Tov <tov@eecs.harvard.edu>
-Maintainer:     tov@eecs.harvard.edu
-Homepage:       http://www.eecs.harvard.edu/~tov/pubs/haskell-session-types/
+Author:         Jesse A. Tov <jesse@eecs.northwestern.edu>
+Maintainer:     jesse@eecs.northwestern.edu
+Homepage:       https://github.com/tov/preprocessor-tools-hs
 Category:       Source-tools, Language, Code Generation
 Synopsis:       A framework for extending Haskell's syntax via quick-and-dirty preprocessors
 Build-type:     Simple
-Tested-with:    GHC == 7.4.1
+Tested-with:    GHC == 8.4.2
 Description:
         This library provides a quick-and-dirty (but often effective)
         method for extending Haskell's syntax using a custom
