diff --git a/ace.cabal b/ace.cabal
--- a/ace.cabal
+++ b/ace.cabal
@@ -1,5 +1,5 @@
 name:                ace
-version:             0.0
+version:             0.1
 synopsis:            Attempto Controlled English parser and printer
 description:         Attempto Controlled English is a formally defined unambiguous language which
                      is a subset of the English language. This package provides a tokenizer,
@@ -21,11 +21,10 @@
 library
   hs-source-dirs:    src/
   ghc-options:       -Wall -O2
-  exposed-modules:   ACE, ACE.Types.Syntax, ACE.Parsers, ACE.Tokenizer, ACE.Types.Tokens, ACE.Combinators
+  exposed-modules:   ACE, ACE.Types.Syntax, ACE.Parsers, ACE.Tokenizer, ACE.Types.Tokens, ACE.Combinators, ACE.Types.Pretty, ACE.Pretty
   build-depends:     attoparsec >= 0.11.1.0,
                      parsec >= 3.1.5,
                      data-default >= 0.5.3,
-                     semigroups >= 0.12.2,
                      text >= 0.11.2.0,
                      base >= 4 && <5,
                      bifunctors
diff --git a/src/ACE/Pretty.hs b/src/ACE/Pretty.hs
new file mode 100644
--- /dev/null
+++ b/src/ACE/Pretty.hs
@@ -0,0 +1,14 @@
+-- |
+
+module ACE.Pretty
+  (module ACE.Types.Pretty
+  ,human)
+  where
+
+import ACE.Types.Pretty
+
+import Data.Default
+
+-- | Human-readable pretty printing settings.
+human :: PrettySettings
+human = def { prettyShowPrecedence = False }
diff --git a/src/ACE/Types/Pretty.hs b/src/ACE/Types/Pretty.hs
new file mode 100644
--- /dev/null
+++ b/src/ACE/Types/Pretty.hs
@@ -0,0 +1,22 @@
+-- | Pretty printing types and classes.
+
+module ACE.Types.Pretty where
+
+import Data.Default
+
+-- | Pretty print a syntax tree node to a string.
+class Pretty p where
+  pretty :: PrettySettings -> p -> String
+
+-- | Prints no string if nothing.
+instance Pretty a => Pretty (Maybe a) where
+  pretty s = maybe "" (pretty s)
+
+-- | Settings used for pretty printing.
+data PrettySettings = PrettySettings
+  { prettyShowPrecedence :: Bool -- ^ Show precedence?
+  }
+
+-- | Precedence showing enabled by default.
+instance Default PrettySettings where
+  def = PrettySettings { prettyShowPrecedence = True }
diff --git a/src/ACE/Types/Syntax.hs b/src/ACE/Types/Syntax.hs
--- a/src/ACE/Types/Syntax.hs
+++ b/src/ACE/Types/Syntax.hs
@@ -9,7 +9,7 @@
 
 import ACE.Pretty
 
-import Data.Semigroup
+import Data.Monoid
 import Data.Text (Text)
 import Prelude hiding (String)
 
