diff --git a/api-tools.cabal b/api-tools.cabal
--- a/api-tools.cabal
+++ b/api-tools.cabal
@@ -1,5 +1,5 @@
 Name:                api-tools
-Version:             0.4
+Version:             0.4.0.1
 Synopsis:            DSL for generating API boilerplate and docs
 Description:         api-tools provides a compact DSL for describing an API.
                      It uses Template Haskell to generate the
@@ -15,7 +15,7 @@
 Copyright:           (c) Iris Connect 2013-2014
 Category:            Network, Web, Cloud, Distributed Computing
 Build-type:          Simple
-
+Extra-source-files:  changelog
 Cabal-version:       >=1.10
 
 Source-Repository head
@@ -25,7 +25,7 @@
 Source-Repository this
   Type:              git
   Location:          git://github.com/iconnect/api-tools.git
-  Tag:               0.4
+  Tag:               0.4.0.1
 
 Library
   Hs-Source-Dirs:    src
@@ -67,27 +67,26 @@
   Build-depends:
         Cabal                >= 1.4      && < 2    ,
         QuickCheck           >= 2.5.1    && < 2.8  ,
-        aeson                >= 0.6.2    && < 0.7  ,
+        aeson                >= 0.6.2    && < 0.9  ,
         aeson-pretty         >= 0.1      && < 0.8  ,
-        array                >= 0.4      && < 0.5  ,
-        attoparsec           >= 0.10.4   && < 0.12 ,
+        array                >= 0.4      && < 0.6  ,
+        attoparsec           >= 0.10.4   && < 0.13 ,
         base                 >= 4        && < 5    ,
         base64-bytestring    >= 1.0      && < 1.1  ,
         bytestring           >= 0.9      && < 0.11 ,
         case-insensitive     >= 1.0      && < 1.3  ,
         containers           >= 0.5      && < 0.6  ,
-        lens                 >= 3.8.7    && < 4    ,
+        lens                 >= 3.8.7    && < 4.4  ,
         old-locale           >= 1.0.0.4  && < 1.1  ,
         regex-compat-tdfa    >= 0.95.1   && < 0.96 ,
         safe                 >= 0.3.3    && < 0.4  ,
         safecopy             >= 0.8.1    && < 0.9  ,
         time                 >= 1.4      && < 1.5  ,
-        template-haskell     >= 2.7      && < 2.9  ,
+        template-haskell     >= 2.7      && < 2.10 ,
         text                 >= 0.11.3   && < 1.2  ,
         unordered-containers >= 0.2.3.0  && < 0.3  ,
         vector               >= 0.10.0.1 && < 0.11
 
-
   Build-tools:
         alex,
         happy
@@ -107,22 +106,22 @@
   Build-depends:
         api-tools,
         QuickCheck           >= 2.5.1    && < 2.8  ,
-        aeson                >= 0.6.2    && < 0.7  ,
+        aeson                >= 0.6.2    && < 0.9  ,
         aeson-pretty         >= 0.1      && < 0.8  ,
-        array                >= 0.4      && < 0.5  ,
-        attoparsec           >= 0.10.4   && < 0.12 ,
+        array                >= 0.4      && < 0.6  ,
+        attoparsec           >= 0.10.4   && < 0.13 ,
         base                 >= 4        && < 5    ,
         base64-bytestring    >= 1.0      && < 1.1  ,
         bytestring           >= 0.9      && < 0.11 ,
         case-insensitive     >= 1.0      && < 1.3  ,
         containers           >= 0.5      && < 0.6  ,
-        lens                 >= 3.8.7    && < 4    ,
+        lens                 >= 3.8.7    && < 4.4  ,
         old-locale           >= 1.0.0.4  && < 1.1  ,
         regex-compat-tdfa    >= 0.95.1   && < 0.96 ,
         safe                 >= 0.3.3    && < 0.4  ,
         safecopy             >= 0.8.1    && < 0.9  ,
         time                 >= 1.4      && < 1.5  ,
-        template-haskell     >= 2.7      && < 2.9  ,
+        template-haskell     >= 2.7      && < 2.10 ,
         text                 >= 0.11.3   && < 1.2  ,
         unordered-containers >= 0.2.3.0  && < 0.3  ,
         vector               >= 0.10.0.1 && < 0.11
@@ -153,16 +152,16 @@
         api-tools,
         Cabal                >= 1.4      && < 2    ,
         QuickCheck           >= 2.5.1    && < 2.8  ,
-        aeson                >= 0.6.2    && < 0.7  ,
+        aeson                >= 0.6.2    && < 0.9  ,
         aeson-pretty         >= 0.1      && < 0.8  ,
-        array                >= 0.4      && < 0.5  ,
-        attoparsec           >= 0.10.4   && < 0.12 ,
+        array                >= 0.4      && < 0.6  ,
+        attoparsec           >= 0.10.4   && < 0.13 ,
         base                 >= 4        && < 5    ,
         base64-bytestring    >= 1.0      && < 1.1  ,
         bytestring           >= 0.9      && < 0.11 ,
         case-insensitive     >= 1.0      && < 1.3  ,
         containers           >= 0.5      && < 0.6  ,
-        lens                 >= 3.8.7    && < 4    ,
+        lens                 >= 3.8.7    && < 4.4  ,
         old-locale           >= 1.0.0.4  && < 1.1  ,
         regex-compat-tdfa    >= 0.95.1   && < 0.96 ,
         safe                 >= 0.3.3    && < 0.4  ,
@@ -171,7 +170,7 @@
         tasty-hunit          >= 0.2      && < 0.9  ,
         tasty-quickcheck     >= 0.3      && < 0.9  ,
         time                 >= 1.4      && < 1.5  ,
-        template-haskell     >= 2.7      && < 2.9  ,
+        template-haskell     >= 2.7      && < 2.10 ,
         text                 >= 0.11.3   && < 1.2  ,
         unordered-containers >= 0.2.3.0  && < 0.3  ,
         vector               >= 0.10.0.1 && < 0.11
diff --git a/changelog b/changelog
new file mode 100644
--- /dev/null
+++ b/changelog
@@ -0,0 +1,18 @@
+-*-change-log-*-
+
+0.4.0.1 Adam Gundry <adam@well-typed.com> July 2014
+	* Widen dependency compatibility to support GHC 7.8.3
+
+0.4 Adam Gundry <adam@well-typed.com> May 2014
+	* Support read-only fields and default values in JSON parser
+	* Better error messages when parsing unions
+	* More accurate version bounds in Cabal file
+	* Support custom migrations on non-record types
+	* Add instance IsString APIType
+
+0.3 Adam Gundry <adam@well-typed.com> Apr 2014
+	* Add tool to perform generic traversals
+	* Move API normal forms and dependency analysis to a new module
+
+0.2 Chris Dornan <chrisd@irisconnect.co.uk> Feb 2014
+	* First public release
diff --git a/src/Data/API/JSON.hs b/src/Data/API/JSON.hs
--- a/src/Data/API/JSON.hs
+++ b/src/Data/API/JSON.hs
@@ -42,7 +42,6 @@
     , expectedString
     , badFormat
     , withInt
-    , withNum
     , withIntRange
     , withBinary
     , withBool
@@ -63,9 +62,9 @@
 
 import           Control.Applicative
 import qualified Data.Aeson                     as JS
+import qualified Data.Aeson.Parser              as JS
 import           Data.Aeson.TH
-import           Data.Attoparsec.Number
-import           Data.Attoparsec.Text
+import           Data.Attoparsec.ByteString
 import qualified Data.ByteString.Char8          as B
 import qualified Data.ByteString.Base64         as B64
 import qualified Data.ByteString.Lazy           as BL
@@ -74,6 +73,7 @@
 import           Data.Maybe
 import qualified Data.SafeCopy                  as SC
 import qualified Data.Text                      as T
+import qualified Data.Text.Encoding             as T
 import           Data.Time
 import           Data.Traversable
 import qualified Data.Vector                    as V
@@ -352,11 +352,13 @@
 withInt :: String -> (Int -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a
 withInt = withNum
 
-withNum :: Num n => String -> (n -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a
-withNum _ f (JS.Number (I n)) = f (fromInteger n)
-withNum _ f (JS.String s)
-  | Right (I n) <- parseOnly (number <* endOfInput) s = f (fromInteger n)
-withNum s _ v = failWith $ Expected ExpInt s v
+withNum :: JS.FromJSON n => String -> (n -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a
+withNum s f v = case JS.fromJSON v of
+  JS.Success i -> f i
+  JS.Error _ | JS.String t  <- v
+             , Right v'     <- parseOnly (JS.value <* endOfInput) (T.encodeUtf8 t)
+             , JS.Success i <- JS.fromJSON v' -> f i
+             | otherwise                      -> failWith $ Expected ExpInt s v
 
 withIntRange :: IntRange -> String -> (Int -> ParserWithErrs a)
              -> JS.Value -> ParserWithErrs a
@@ -382,9 +384,9 @@
 withBool :: String -> (Bool -> ParserWithErrs a)
          -> JS.Value -> ParserWithErrs a
 withBool _ f (JS.Bool b) = f b
-withBool _ f (JS.Number (I i)) | i == 0 = f False
-                               | i == 1 = f True
-withBool s _ v           = failWith $ Expected ExpBool s v
+withBool _ f (JS.Number x) | x == 0 = f False
+                           | x == 1 = f True
+withBool s _ v                      = failWith $ Expected ExpBool s v
 
 withText :: String -> (T.Text -> ParserWithErrs a)
          -> JS.Value -> ParserWithErrs a
diff --git a/tests/Data/API/Test/Migration.hs b/tests/Data/API/Test/Migration.hs
--- a/tests/Data/API/Test/Migration.hs
+++ b/tests/Data/API/Test/Migration.hs
@@ -17,7 +17,6 @@
 
 import qualified Data.Aeson               as JS
 import qualified Data.Aeson.Encode.Pretty as JS
-import           Data.Attoparsec.Number
 import qualified Data.ByteString.Char8    as B
 import qualified Data.ByteString.Base64   as B64
 import qualified Data.ByteString.Lazy.Char8 as BL
@@ -60,8 +59,8 @@
     i <- HMap.lookup "id" x ?! CustomMigrationError "missing id" (JS.Object x)
     b <- HMap.lookup "c" x  ?! CustomMigrationError "missing b" (JS.Object x)
     r <- case (i, b) of
-        (JS.Number (I j), JS.String t)
-            -> return $ JS.String $ t `T.append` T.pack (show j)
+        (JS.Number j, JS.String t)
+            -> return $ JS.String $ t `T.append` T.pack (show (round j :: Int))
         _   -> Left $ CustomMigrationError "bad data" (JS.Object x)
     return $ HMap.insert "c" r x
 testRecordMigration DuplicateNew = mkRecordMigration $ \ x -> do
