diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,15 @@
+## [v0.4](https://github.com/diagrams/diagrams-haddock/tree/v0.4) (2016-10-26)
+
+- Build with `ghc-8.0`
+- Improved error message when `setup-config` can't be read
+- Fix bug in CPP handling
+- Replace `lucid-svg` with `svg-builder`
+- Allow `diagrams-svg-1.4`
+- Require `diagrams-lib-1.4`
+- Allow `haskell-src-exts-1.18`
+- Allow `diagrams-builder-0.8`
+- Allow `lens-4.15`
+
 ## [v0.3.0.10](https://github.com/diagrams/diagrams-haddock/tree/v0.3.0.10) (2015-12-06)
 
 - allow `haskell-src-exts-1.17.*`
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,8 @@
-Copyright (c) 2013-2015, diagrams-haddock team:
+Copyright (c) 2013-2016, diagrams-haddock team:
 
   Daniel Bergey <bergey@alum.mit.edu>
+  Christopher Chalmers <c.chalmers@me.com>
+  Sidharth Kapur <sidharthkapur1@gmail.com>
   Jeffrey Rosenbluth <Jeffrey.Rosenbluth@gmail.com>
   Tillmann Vogt <tillk.vogt@googlemail.com>
   Ryan Yates <fryguybob@gmail.com>
diff --git a/diagrams-haddock.cabal b/diagrams-haddock.cabal
--- a/diagrams-haddock.cabal
+++ b/diagrams-haddock.cabal
@@ -1,5 +1,5 @@
 name:                diagrams-haddock
-version:             0.3.0.10
+version:             0.4
 synopsis:            Preprocessor for embedding diagrams in Haddock documentation
 description:         diagrams-haddock is a tool for compiling embedded inline
                      diagrams code in Haddock documentation, for an
@@ -26,7 +26,7 @@
 cabal-version:       >=1.10
 extra-source-files:  README.md, CHANGES.md, diagrams/*.svg
 extra-doc-files:     diagrams/*.svg
-tested-with:         GHC == 7.8.4, GHC == 7.10.1
+tested-with:         GHC == 7.10.2, GHC == 8.0.1
 
 Source-repository head
   type: git
@@ -34,7 +34,8 @@
 
 library
   exposed-modules:     Diagrams.Haddock
-  build-depends:       base >= 4.4 && < 4.9,
+  other-modules:       Paths_diagrams_haddock
+  build-depends:       base >= 4.4 && < 5.0,
                        filepath,
                        directory,
                        mtl >= 2.0 && < 2.3,
@@ -43,12 +44,12 @@
                        bytestring >= 0.9 && < 0.11,
                        strict >= 0.3 && < 0.4,
                        parsec >= 3,
-                       haskell-src-exts >= 1.16 && < 1.18,
-                       lucid-svg >= 0.5 && < 0.7,
-                       diagrams-builder >= 0.5 && < 0.8,
-                       diagrams-lib >= 0.6 && < 1.4,
-                       diagrams-svg >= 0.8.0.1 && < 1.4,
-                       lens >= 3.8 && < 4.14,
+                       haskell-src-exts >= 1.18 && < 1.19,
+                       svg-builder >= 0.1 && < 0.2,
+                       diagrams-builder >= 0.5 && < 0.9,
+                       diagrams-lib >= 1.4 && < 1.5,
+                       diagrams-svg >= 1.4 && < 1.5,
+                       lens >= 3.8 && < 4.16,
                        linear >= 1.10 && < 1.21,
                        cpphs >= 1.15,
                        cautious-file >= 1.0 && < 1.1,
@@ -67,7 +68,7 @@
                        filepath,
                        diagrams-haddock,
                        cmdargs >= 0.8 && < 0.11,
-                       Cabal >= 1.14 && < 1.23,
+                       Cabal >= 1.14 && < 1.25,
                        cpphs >= 1.15
   hs-source-dirs:      tools
   default-language:    Haskell2010
@@ -77,12 +78,12 @@
   main-is:             Tests.hs
   build-depends:       base,
                        containers >= 0.4 && < 0.6,
-                       QuickCheck >= 2.4 && < 2.9,
+                       QuickCheck >= 2.4 && < 2.10,
                        tasty >= 0.8 && < 0.12,
                        tasty-quickcheck >= 0.8 && < 0.9,
                        parsec >= 3,
-                       lens >= 3.8 && < 4.14,
-                       haskell-src-exts >= 1.16 && < 1.17,
+                       lens >= 3.8 && < 4.16,
+                       haskell-src-exts >= 1.18 && < 1.19,
                        diagrams-haddock
   hs-source-dirs:      test
   default-language:    Haskell2010
diff --git a/src/Diagrams/Haddock.hs b/src/Diagrams/Haddock.hs
--- a/src/Diagrams/Haddock.hs
+++ b/src/Diagrams/Haddock.hs
@@ -1,5 +1,5 @@
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE FlexibleContexts           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE OverloadedStrings          #-}
 {-# LANGUAGE ScopedTypeVariables        #-}
 {-# LANGUAGE TemplateHaskell            #-}
@@ -73,64 +73,68 @@
 
     ) where
 
-import           Control.Applicative             hiding (many, (<|>))
-import           Control.Arrow                   (first, (&&&), (***))
-import           Control.Lens                    (makeLenses, orOf, traverse,
-                                                  view, (%%~), (%~), (&), (.~),
-                                                  (^.), _2, _Right)
+import           Control.Arrow               (first, (&&&), (***))
+import           Control.Lens                (makeLenses, orOf, view, (%%~),
+                                              (%~), (&), (.~), (^.), _2, _Right)
 import           Control.Monad.Writer
-import qualified Data.ByteString.Base64.Lazy     as BS64
-import qualified Data.ByteString.Lazy            as BS
-import qualified Data.ByteString.Lazy.Char8      as BS8
-import           Data.Char                       (isSpace)
-import           Data.Either                     (lefts, rights)
-import           Data.Function                   (on)
-import           Data.Generics.Uniplate.Data     (universeBi)
-import           Data.List                       (groupBy, intercalate,
-                                                  isPrefixOf, partition)
-import           Data.List.Split                 (dropBlanks, dropDelims, split,
-                                                  whenElt)
-import qualified Data.Map                        as M
-import           Data.Maybe                      (catMaybes, mapMaybe)
-import qualified Data.Set                        as S
-import qualified Data.Text.Lazy                  as T
-import qualified Data.Text.Lazy.Encoding         as T
-import           Language.Haskell.Exts.Annotated hiding (loc)
-import qualified Language.Haskell.Exts.Annotated as HSE
+import qualified Data.ByteString.Base64.Lazy as BS64
+import qualified Data.ByteString.Lazy        as BS
+import qualified Data.ByteString.Lazy.Char8  as BS8
+import           Data.Char                   (isSpace)
+import           Data.Either                 (lefts, rights)
+import           Data.Function               (on)
+import           Data.Generics.Uniplate.Data (universeBi)
+import           Data.List                   (groupBy, intercalate, isPrefixOf,
+                                              partition)
+import           Data.List.Split             (dropBlanks, dropDelims, split,
+                                              whenElt)
+import qualified Data.Map                    as M
+import           Data.Maybe                  (catMaybes, mapMaybe)
+import qualified Data.Set                    as S
+import qualified Data.Text.Lazy              as T
+import qualified Data.Text.Lazy.Encoding     as T
+import qualified Graphics.Svg                as G
+import           Language.Haskell.Exts       hiding (loc)
+import qualified Language.Haskell.Exts       as HSE
 import           Language.Preprocessor.Cpphs
-import qualified Lucid.Svg                       as L
-import           System.Console.ANSI             (setCursorColumn)
-import           System.Directory                (copyFile,
-                                                  createDirectoryIfMissing,
-                                                  doesFileExist)
-import           System.FilePath                 (dropExtension, normalise,
-                                                  splitDirectories, (<.>),
-                                                  (</>))
-import qualified System.IO                       as IO
-import qualified System.IO.Cautious              as Cautiously
-import qualified System.IO.Strict                as Strict
+import           System.Console.ANSI         (setCursorColumn)
+import           System.Directory            (copyFile,
+                                              createDirectoryIfMissing,
+                                              doesFileExist)
+import           System.FilePath             (dropExtension, normalise,
+                                              splitDirectories, (<.>), (</>))
+import qualified System.IO                   as IO
+import qualified System.IO.Cautious          as Cautiously
+import qualified System.IO.Strict            as Strict
 import           Text.Parsec
-import qualified Text.Parsec                     as P
+import qualified Text.Parsec                 as P
 import           Text.Parsec.String
 
-import           Diagrams.Backend.SVG            (Options (..), SVG (..))
-import qualified Diagrams.Builder                as DB
-import           Diagrams.Prelude                (V2, zero)
-import           Diagrams.TwoD.Size              (mkSizeSpec2D)
+import           Diagrams.Backend.SVG        (Options (..), SVG (..))
+import qualified Diagrams.Builder            as DB
+import           Diagrams.Prelude            (V2, zero)
+import           Diagrams.TwoD.Size          (mkSizeSpec2D)
 
 ------------------------------------------------------------
 -- Utilities
 ------------------------------------------------------------
 
+-- | Pretty-print a parse failure at a particular location.
 showParseFailure :: SrcLoc -> String -> String
 showParseFailure loc err = unlines [ prettyPrint loc, err ]
 
+-- | A simple monad for collecting a list of error messages.  There is
+--   no facility for failing as such---in this model one simply
+--   generates an error message and moves on.
 newtype CollectErrors a = CE { unCE :: Writer [String] a }
   deriving (Functor, Applicative, Monad, MonadWriter [String])
 
+-- | Generate an error message and fail (by returning @Nothing@).
 failWith :: String -> CollectErrors (Maybe a)
 failWith err = tell [err] >> return Nothing
 
+-- | Run a @CollectErrors@ computation, resulting in a value of type
+--   @a@ along with the collection of generated error messages.
 runCE :: CollectErrors a -> (a, [String])
 runCE = runWriter . unCE
 
@@ -455,7 +459,7 @@
 
         let
                      bopts :: DB.BuildOpts SVG V2 Double
-                     bopts = DB.mkBuildOpts SVG zero (SVGOptions (mkSizeSpec2D w h) Nothing "")
+                     bopts = DB.mkBuildOpts SVG zero (SVGOptions (mkSizeSpec2D w h) Nothing "" [] False)
                       & DB.snippets .~ map (view codeBlockCode) neededCode
                       & DB.imports  .~ [ "Diagrams.Backend.SVG" ]
                       & DB.diaExpr  .~ (url ^. diagramName)
@@ -483,7 +487,7 @@
             else return (newURL outFile)
         DB.OK hash svg     -> do
           let cached = mkCached (DB.hashToHexStr hash)
-              svgBS  = L.renderBS svg
+              svgBS  = G.renderBS svg
           liftIO $ BS.writeFile cached svgBS
           url' <- if dataURIs
                     then return (newURL (mkDataURI svgBS))
@@ -574,10 +578,11 @@
               when changed $ Cautiously.writeFileL file (T.encodeUtf8 . T.pack $ src')
               return (msgs ++ msgs2)
   where
-    go src =
-      case runCE (parseCodeBlocks file src) of
-        r@(Nothing, msgs) -> if any (("Parse error: #" `elem`) . lines) msgs
-                             then runCpp src >>= return . runCE . parseCodeBlocks file
-                             else return r
-        r -> return r
+    go src | needsCPP src = runCpp src >>= return . runCE . parseCodeBlocks file
+           | otherwise    = return $ runCE (parseCodeBlocks file src)
+
+    needsCPP src = case readExtensions src of
+                     Just (_, es) | EnableExtension CPP `elem` es -> True
+                     _                                            -> False
+
     runCpp s = runCpphs opts file s
diff --git a/test/Tests.hs b/test/Tests.hs
--- a/test/Tests.hs
+++ b/test/Tests.hs
@@ -2,17 +2,15 @@
 
 module Main where
 
-import           Control.Applicative
-import           Control.Lens                    (view)
-import           Data.Either                     (rights)
-import           Data.List                       ((\\))
-import qualified Data.Map                        as M
-import qualified Data.Set                        as S
-import           Language.Haskell.Exts.Annotated
+import           Control.Lens          (view)
+import           Data.Either           (rights)
+import           Data.List             ((\\))
+import qualified Data.Map              as M
+import qualified Data.Set              as S
 import           Test.QuickCheck
 import           Test.Tasty
-import           Test.Tasty.QuickCheck           as QC
-import qualified Text.Parsec                     as P
+import           Test.Tasty.QuickCheck as QC
+import qualified Text.Parsec           as P
 
 import           Diagrams.Haddock
 
@@ -47,19 +45,6 @@
     where
       s    = getEString <$> arbitrary
       opts = (M.fromList . (map . both) getEString) <$> arbitrary
-
-instance Arbitrary SrcSpan where
-  arbitrary = do
-    NonEmpty fName  <- arbitrary
-    Positive startLn <- arbitrary
-    NonNegative startCol  <- arbitrary
-    NonNegative numLines  <- arbitrary
-    NonNegative numCols   <- arbitrary
-
-    return $ SrcSpan fName startLn startCol (startLn + numLines) (startCol + numCols)
-
-instance Arbitrary Comment where
-  arbitrary = Comment <$> arbitrary <*> arbitrary <*> arbitrary
 
 prop_parseDisplay :: DiagramURL -> Bool
 prop_parseDisplay d
diff --git a/tools/diagrams-haddock.hs b/tools/diagrams-haddock.hs
--- a/tools/diagrams-haddock.hs
+++ b/tools/diagrams-haddock.hs
@@ -15,6 +15,7 @@
 import qualified Distribution.PackageDescription    as P
 import           Distribution.Simple.Configure      (maybeGetPersistBuildConfig)
 import           Distribution.Simple.LocalBuildInfo (localPkgDescr)
+import           Distribution.Simple.Utils          (cabalVersion)
 
 import           Language.Preprocessor.Cpphs
 
@@ -75,7 +76,8 @@
   }
   &= program "diagrams-haddock"
   &= summary (unlines
-       [ "diagrams-haddock v" ++ showVersion version ++ ", (c) 2013 diagrams-haddock team (see LICENSE)"
+       [ "diagrams-haddock v" ++ showVersion version ++ ", (c) 2013-2016 diagrams-haddock team (see LICENSE)"
+       , "compiled using version " ++ showVersion cabalVersion ++ " of the Cabal library"
        , ""
        , "Compile inline diagrams code in Haddock documentation."
        , ""
@@ -126,8 +128,16 @@
 
   mlbi <- maybeGetPersistBuildConfig fullDistDir
   case mlbi of
-    Nothing -> putStrLn $
-      "No setup-config found in " ++ fullDistDir ++ ", please run 'cabal configure' first."
+    Nothing -> putStrLn $ unlines [
+        "diagrams-haddock: No appropriate setup-config found in " ++ fullDistDir
+      , "Either it does not exist or it is in the wrong format."
+      , "* You may need to run 'cabal configure' first."
+      , "* Make sure that the version of Cabal used to compile"
+      , "  diagrams-haddock (" ++ showVersion cabalVersion ++ ") matches the version used"
+      , "  by the cabal tool."
+      , "* Use the -d option if you want diagrams-haddock to look in"
+      , "  a different dist directory."
+      ]
     Just lbi -> do
       let mlib = P.library . localPkgDescr $ lbi
       case mlib of
