diff --git a/Language/LaTeX.hs b/Language/LaTeX.hs
--- a/Language/LaTeX.hs
+++ b/Language/LaTeX.hs
@@ -65,7 +65,6 @@
   ,runLatexM
   )
 where
-import Data.Monoid (Monoid(..))
 import Data.List (intercalate)
 import Language.LaTeX.Types
 import Language.LaTeX.Printer (showLaTeX)
diff --git a/Language/LaTeX/Builder.hs b/Language/LaTeX/Builder.hs
--- a/Language/LaTeX/Builder.hs
+++ b/Language/LaTeX/Builder.hs
@@ -55,13 +55,11 @@
 import Data.List hiding (sum, and, group, unwords)
 import qualified Data.List as L
 import Data.Ratio
-import Data.Monoid
 import Data.Char
 import Data.Maybe
 import Data.Foldable (foldMap)
 import Data.Traversable
 import Data.String (IsString(..))
-import Control.Applicative hiding (optional)
 import Control.Monad hiding (mapM)
 import Control.Monad.Error (throwError)
 import Control.Monad.Writer (Writer, execWriter, tell)
diff --git a/Language/LaTeX/Builder/Beamer.hs b/Language/LaTeX/Builder/Beamer.hs
--- a/Language/LaTeX/Builder/Beamer.hs
+++ b/Language/LaTeX/Builder/Beamer.hs
@@ -8,10 +8,8 @@
 import qualified Language.LaTeX.Builder.Internal as BI
 import qualified Language.LaTeX.Builder as B
 import Language.LaTeX.Builder.QQ
-import Control.Applicative
 import Data.List (intersperse)
 import Data.Maybe
-import Data.Monoid
 
 {-
 pkg :: PackageName
diff --git a/Language/LaTeX/Builder/Internal.hs b/Language/LaTeX/Builder/Internal.hs
--- a/Language/LaTeX/Builder/Internal.hs
+++ b/Language/LaTeX/Builder/Internal.hs
@@ -5,9 +5,7 @@
                        sin, cos, succ, sum, pi, mapM)
 import qualified Data.List as L
 import Data.Maybe
-import Data.Monoid
 import Data.Traversable (sequenceA, mapM)
-import Control.Applicative hiding (optional)
 import Control.Monad hiding (mapM)
 import Control.Monad.Error (throwError)
 
diff --git a/Language/LaTeX/Builder/Math.hs b/Language/LaTeX/Builder/Math.hs
--- a/Language/LaTeX/Builder/Math.hs
+++ b/Language/LaTeX/Builder/Math.hs
@@ -45,7 +45,6 @@
 import Data.String
 import qualified Data.IntMap as IntMap
 import Control.Arrow
-import Control.Applicative
 import Control.Monad hiding (mapM)
 import Control.Monad.Error (throwError)
 
diff --git a/Language/LaTeX/Builder/MonoidUtils.hs b/Language/LaTeX/Builder/MonoidUtils.hs
--- a/Language/LaTeX/Builder/MonoidUtils.hs
+++ b/Language/LaTeX/Builder/MonoidUtils.hs
@@ -1,6 +1,5 @@
 module Language.LaTeX.Builder.MonoidUtils (ø, (⊕), (<>), (<||>), (<&&>), mapNonEmpty) where
 
-import Data.Monoid
 import Data.Monoid.Unicode ((⊕))
 
 ø :: Monoid m => m
diff --git a/Language/LaTeX/Builder/QQ.hs b/Language/LaTeX/Builder/QQ.hs
--- a/Language/LaTeX/Builder/QQ.hs
+++ b/Language/LaTeX/Builder/QQ.hs
@@ -12,7 +12,6 @@
 
 import Data.List
 import Data.Char
-import Data.Functor
 import Language.Haskell.TH (Q, Exp, Name, appE, varE, stringE, litP, stringL, valD,
                             varP, sigD, mkName, normalB, conE)
 import Language.Haskell.TH.Quote
diff --git a/Language/LaTeX/Printer.hs b/Language/LaTeX/Printer.hs
--- a/Language/LaTeX/Printer.hs
+++ b/Language/LaTeX/Printer.hs
@@ -1,6 +1,5 @@
 module Language.LaTeX.Printer where
 
-import Data.Monoid
 import Data.List (intersperse)
 import Data.Ratio (numerator, denominator)
 import Data.Foldable (foldMap)
diff --git a/Language/LaTeX/Slicer.hs b/Language/LaTeX/Slicer.hs
--- a/Language/LaTeX/Slicer.hs
+++ b/Language/LaTeX/Slicer.hs
@@ -2,7 +2,6 @@
   (marknote, mark, marker, (^$), slice)
 where
 
-import Data.Monoid
 import Control.Monad.Writer
 import Language.LaTeX.Types
 import Language.LaTeX.Builder.MonoidUtils
diff --git a/Language/LaTeX/Types.hs b/Language/LaTeX/Types.hs
--- a/Language/LaTeX/Types.hs
+++ b/Language/LaTeX/Types.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving, TemplateHaskell,
-             DeriveDataTypeable, PatternGuards #-}
+             DeriveDataTypeable, PatternGuards,
+             DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
 
 -- Those extensions are required by the Uniplate instances.
 --{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
@@ -9,12 +10,10 @@
 import Data.Monoid (Monoid(..))
 import Data.List (intercalate)
 import Data.Ratio ((%))
-import Data.Traversable
 import Data.Foldable
 import Data.String (IsString(..))
 -- import Data.Generics.PlateTypeable
 import Data.Data
-import Data.DeriveTH
 import Control.Applicative
 import Control.Arrow (second)
 import Control.Monad.Writer (Writer)
@@ -73,12 +72,14 @@
                  | PreambleNote Key Note PreambleItm
   deriving (Show, Eq, Typeable, Data)
 
+instance Semigroup PreambleItm where
+  PreambleConcat xs <> PreambleConcat ys = PreambleConcat (xs ++ ys)
+  PreambleConcat xs <> y                 = PreambleConcat (xs ++ [y])
+  x                 <> PreambleConcat ys = PreambleConcat (x : ys)
+  x                 <> y                 = PreambleConcat [x, y]
+
 instance Monoid PreambleItm where
-  mempty  = PreambleConcat []
-  PreambleConcat xs `mappend` PreambleConcat ys = PreambleConcat (xs ++ ys)
-  PreambleConcat xs `mappend` y                 = PreambleConcat (xs ++ [y])
-  x                 `mappend` PreambleConcat ys = PreambleConcat (x : ys)
-  x                 `mappend` y                 = PreambleConcat [x, y]
+  mempty = PreambleConcat []
 
 data TexDcl = TexDcl { texDeclName :: String
                      , texDeclArgs :: [Arg AnyItm]
@@ -123,18 +124,20 @@
 appendAny Length{}      _ = Nothing
 appendAny SaveBin{}     _ = Nothing
 
+instance Semigroup LatexItm where
+  RawTex xs       <> RawTex ys = RawTex (xs ++ ys)
+  LatexCast x     <> LatexCast y | Just z <- appendAny x y = LatexCast z
+  LatexEmpty      <> x = x
+  x               <> LatexEmpty = x
+  LatexAppend x y <> z = x <> (y <> z) -- TODO complexity issue?
+  x <> LatexAppend y z =
+    case x <> y of
+      LatexAppend x' y' -> x' `LatexAppend` (y' <> z) -- TODO complexity issue?
+      xy                -> xy <> z
+  x               <> y = x `LatexAppend` y
+
 instance Monoid LatexItm where
   mempty  = LatexEmpty -- LatexConcat []
-  RawTex xs       `mappend` RawTex ys = RawTex (xs ++ ys)
-  LatexCast x     `mappend` LatexCast y | Just z <- appendAny x y = LatexCast z
-  LatexEmpty      `mappend` x = x
-  x               `mappend` LatexEmpty = x
-  LatexAppend x y `mappend` z = x `mappend` (y `mappend` z) -- TODO complexity issue?
-  x `mappend` LatexAppend y z =
-    case x `mappend` y of
-      LatexAppend x' y' -> x' `LatexAppend` (y' `mappend` z) -- TODO complexity issue?
-      xy                -> xy `mappend` z
-  x               `mappend` y = x `LatexAppend` y
 
 {-
   LatexConcat xs `mappend` LatexConcat ys = LatexConcat (xs ++ ys)
@@ -150,7 +153,7 @@
     where f = RawTex . concatMap rawhchar . intercalate "\n" . filter (not . null) . lines
 
 data Named a = Named String a
-  deriving (Show, Eq, Typeable, Data)
+  deriving (Show, Eq, Typeable, Data, Functor, Foldable, Traversable)
 
 data PackageAction = PackageDependency PackageName
                    | ProvidePackage    PackageName
@@ -166,15 +169,17 @@
            | RawArg String
            | LiftArg a
            | PackageAction PackageAction
-  deriving (Show, Eq, Typeable, Data)
+  deriving (Show, Eq, Typeable, Data, Functor, Foldable, Traversable)
 
 data Star = Star | NoStar
   deriving (Show, Eq, Typeable, Data)
 
+instance Semigroup Star where
+  NoStar <> x      = x
+  x      <> _      = x
+
 instance Monoid Star where
   mempty = NoStar
-  NoStar `mappend` x      = x
-  x      `mappend` _      = x
 
 data Coord = MkCoord LatexLength LatexLength
   deriving (Show, Eq, Typeable, Data)
@@ -191,12 +196,14 @@
              | ParNote Key Note ParItm
   deriving (Show, Eq, Typeable, Data)
 
+instance Semigroup ParItm where
+  ParConcat xs <> ParConcat ys = ParConcat (xs ++ ys)
+  ParConcat xs <> y            = ParConcat (xs ++ [y])
+  x            <> ParConcat ys = ParConcat (x : ys)
+  x            <> y            = ParConcat [x, y]
+
 instance Monoid ParItm where
-  mempty  = ParConcat []
-  ParConcat xs `mappend` ParConcat ys = ParConcat (xs ++ ys)
-  ParConcat xs `mappend` y            = ParConcat (xs ++ [y])
-  x            `mappend` ParConcat ys = ParConcat (x : ys)
-  x            `mappend` y            = ParConcat [x, y]
+  mempty = ParConcat []
 
 unParNote :: ParItm -> Maybe (Key, Note, ParItm)
 unParNote (ParNote k n p) = Just (k, n, p)
@@ -222,12 +229,14 @@
                | MathNote Key Note MathItm
   deriving (Show, Eq, Typeable, Data)
 
+instance Semigroup MathItm where
+  MathConcat xs <> MathConcat ys = MathConcat (xs ++ ys)
+  MathConcat xs <> y             = MathConcat (xs ++ [y])
+  x             <> MathConcat ys = MathConcat (x : ys)
+  x             <> y             = MathConcat [x, y]
+
 instance Monoid MathItm where
-  mempty  = MathConcat []
-  MathConcat xs `mappend` MathConcat ys = MathConcat (xs ++ ys)
-  MathConcat xs `mappend` y              = MathConcat (xs ++ [y])
-  x              `mappend` MathConcat ys = MathConcat (x : ys)
-  x              `mappend` y              = MathConcat [x, y]
+  mempty = MathConcat []
 
 instance Num MathItm where
   (+) = MathBinOp "+"
@@ -305,9 +314,11 @@
   signum = error "LatexLength.signum is undefined"
   fromInteger = LengthCst Nothing . (%1)
 
+instance Semigroup LatexLength where
+  (<>) = (+)
+
 instance Monoid LatexLength where
   mempty = 0
-  mappend = (+)
 
 instance Fractional LatexLength where
   x / LengthCst Nothing ry = scaleBy (1/ry) x
@@ -323,7 +334,7 @@
                | Rr --- ^ Right
                | Rvline --- ^ A vertical line
                | Rtext a --- ^ A fixed text column (@-expression in LaTeX parlance)
-  deriving (Show, Eq, Typeable, Data)
+  deriving (Show, Eq, Typeable, Data, Functor, Foldable, Traversable)
 
 {-
 instance Functor RowSpec where
@@ -381,7 +392,7 @@
 data Row cell = Cells [cell]
               | Hline
               | Cline Int Int
-  deriving (Show, Eq, Typeable, Data)
+  deriving (Show, Eq, Typeable, Data, Functor, Foldable, Traversable)
 
 {-
 instance Functor Row where
@@ -433,10 +444,12 @@
             MonadError ErrorMessage, Show, Eq, Num, Fractional,
             Typeable, Data)
 
+instance Semigroup a => Semigroup (LatexM a) where
+  (<>) = liftM2 (<>)
+-- sconcat = liftM sconcat . sequenceA
+
 instance Monoid a => Monoid (LatexM a) where
   mempty = pure mempty
-  mappend = liftM2 mappend
-  mconcat = liftM mconcat . sequenceA
 
 instance IsString a => IsString (LatexM a) where fromString = pure . fromString
 
@@ -447,7 +460,7 @@
 newtype AnyItem   = AnyItem { anyItmM :: LatexM AnyItm }
   deriving (Eq, Show, Typeable, Data)
 newtype MathItem  = MathItem { mathItmM :: LatexM MathItm }
-  deriving (Monoid, Eq, Show, Num, Fractional, Typeable, Data)
+  deriving (Semigroup, Monoid, Eq, Show, Num, Fractional, Typeable, Data)
 
 type ListItem  = LatexM ListItm
 type PreambleItem = LatexM PreambleItm
@@ -483,19 +496,6 @@
 
 -- instance (Integral a, Typeable a, Typeable b, PlateAll a b) => PlateAll (Ratio a) b where
 --   plateAll r = plate (%) |+ numerator r |+ denominator r
-
-$(derive makeFunctor     ''Named)
-$(derive makeFoldable    ''Named)
-$(derive makeTraversable ''Named)
-$(derive makeFunctor     ''Arg)
-$(derive makeFoldable    ''Arg)
-$(derive makeTraversable ''Arg)
-$(derive makeFunctor     ''RowSpec)
-$(derive makeFoldable    ''RowSpec)
-$(derive makeTraversable ''RowSpec)
-$(derive makeFunctor     ''Row)
-$(derive makeFoldable    ''Row)
-$(derive makeTraversable ''Row)
 
 {-
 $(derive makeUniplateTypeable ''SaveBin)
diff --git a/hlatex.cabal b/hlatex.cabal
--- a/hlatex.cabal
+++ b/hlatex.cabal
@@ -1,6 +1,6 @@
 name:            hlatex
-cabal-version:   >= 1.8
-version:         0.3.1
+cabal-version:   >= 1.10
+version:         0.3.2
 license:         BSD3
 license-File:    LICENSE
 copyright:       (c) Nicolas Pouillard
@@ -20,7 +20,7 @@
                  base>=3.0&&<5, containers>=0.1, process, filepath, directory,
                  template-haskell >= 2.5,
                  transformers>=0.2.1&&<1, mtl>2.0, base-unicode-symbols,
-                 uniplate>=1.4&&<1.7, derive, utf8-string
+                 uniplate>=1.4&&<1.7, utf8-string
     exposed-modules:
                  Language.LaTeX,
                  Language.LaTeX.Types,
@@ -40,12 +40,14 @@
                  Language.LaTeX.Checker,
                  Language.LaTeX.Unicode
     ghc-options: -Wall
+    default-language: Haskell2010
 
 executable generate_hlatex_user_guide
     Build-depends: base>=3.0, containers>=0.1, frquotes,
                    transformers, mtl>2.0, base-unicode-symbols
     main-is: doc/user_guide.hs
     ghc-options: -Wall
+    default-language: Haskell2010
   if !flag(build_doc)
     Buildable: False
 
