diff --git a/Language/Javascript/JMacro/Base.hs b/Language/Javascript/JMacro/Base.hs
--- a/Language/Javascript/JMacro/Base.hs
+++ b/Language/Javascript/JMacro/Base.hs
@@ -47,6 +47,7 @@
 import qualified Data.Text as TS
 import Data.Generics
 import Data.Monoid(Monoid, mappend, mempty)
+import Data.Semigroup(Semigroup(..))
 
 import Numeric(showHex)
 import Safe
@@ -134,12 +135,16 @@
 type JsLabel = String
 
 
+instance Semigroup JStat where
+    (<>) (BlockStat xs) (BlockStat ys) = BlockStat $ xs ++ ys
+    (<>) (BlockStat xs) ys = BlockStat $ xs ++ [ys]
+    (<>) xs (BlockStat ys) = BlockStat $ xs : ys
+    (<>) xs ys = BlockStat [xs,ys]
+
+
 instance Monoid JStat where
     mempty = BlockStat []
-    mappend (BlockStat xs) (BlockStat ys) = BlockStat $ xs ++ ys
-    mappend (BlockStat xs) ys = BlockStat $ xs ++ [ys]
-    mappend xs (BlockStat ys) = BlockStat $ xs : ys
-    mappend xs ys = BlockStat [xs,ys]
+    mappend x y = x <> y
 
 
 -- TODO: annotate expressions with type
diff --git a/jmacro.cabal b/jmacro.cabal
--- a/jmacro.cabal
+++ b/jmacro.cabal
@@ -1,5 +1,5 @@
 name:                jmacro
-version:             0.6.14
+version:             0.6.15
 synopsis:            QuasiQuotation library for programmatic generation of Javascript code.
 description:         Javascript syntax, functional syntax, hygienic names, compile-time guarantees of syntactic correctness, limited typechecking. Additional documentation available at <http://www.haskell.org/haskellwiki/Jmacro>
 category:            Language
@@ -7,7 +7,7 @@
 license-file:        LICENSE
 author:              Gershom Bazerman
 maintainer:          gershomb@gmail.com
-Tested-With:         GHC == 8.0.1
+Tested-With:         GHC == 8.4.2
 Build-Type:          Simple
 Cabal-Version:       >= 1.6
 
@@ -29,14 +29,30 @@
   default: False
 
 executable jmacro
-  build-depends:     base >= 4, base < 5, containers, wl-pprint-text, text, safe >= 0.2, parsec > 3.0, template-haskell >= 2.3, mtl > 1.1 , haskell-src-exts, haskell-src-meta, bytestring >= 0.9, syb, aeson >= 0.5 , regex-posix > 0.9, vector >= 0.8, unordered-containers >= 0.2, parseargs
-  main-is: Language/Javascript/JMacro/Executable.hs
+   build-depends:     base >= 4, base < 5, containers, wl-pprint-text, text, safe >= 0.2, parsec > 3.0, template-haskell >= 2.3, mtl > 1.1 , haskell-src-exts, haskell-src-meta, bytestring >= 0.9, syb, aeson >= 0.5 , regex-posix > 0.9, vector >= 0.8, unordered-containers >= 0.2, parseargs
+   main-is: Language/Javascript/JMacro/Executable.hs
+   other-modules: Language.Javascript.JMacro.Util
+                   Language.Javascript.JMacro.TypeCheck
+                   Language.Javascript.JMacro.Types
+                   Language.Javascript.JMacro.Prelude
+                   Language.Javascript.JMacro.Base
+                   Language.Javascript.JMacro.QQ
+                   Language.Javascript.JMacro.ParseTH
 
+
 executable jmacro-bench
   main-is: Language/Javascript/JMacro/Benchmark.hs
   if flag(benchmarks)
     buildable: True
     build-depends: criterion
+    other-modules: Language.Javascript.JMacro.Util
+                   Language.Javascript.JMacro.TypeCheck
+                   Language.Javascript.JMacro.Types
+                   Language.Javascript.JMacro.Prelude
+                   Language.Javascript.JMacro.Base
+                   Language.Javascript.JMacro.QQ
+                   Language.Javascript.JMacro.ParseTH
+
   else
     buildable: False
 
