diff --git a/htoml-megaparsec.cabal b/htoml-megaparsec.cabal
--- a/htoml-megaparsec.cabal
+++ b/htoml-megaparsec.cabal
@@ -1,10 +1,9 @@
 name:                     htoml-megaparsec
-version:                  1.0.1.1
+version:                  1.0.1.2
 synopsis:                 Parser for TOML files
 description:              TOML is an obvious and minimal format for config files.
                           This package provides a TOML parser
-                          built with the Megaparsec. It exposes a JSON
-                          interface using Aeson.
+                          built with the Megaparsec.
 homepage:                 https://github.com/vmchale/htoml-megaparsec
 bug-reports:              https://github.com/vmchale/htoml-megaparsec/issues
 license:                  BSD3
diff --git a/src/Text/Toml/Parser.hs b/src/Text/Toml/Parser.hs
--- a/src/Text/Toml/Parser.hs
+++ b/src/Text/Toml/Parser.hs
@@ -33,7 +33,7 @@
 
 import           Text.Toml.Types
 
--- Imported as last to fix redundancy warning
+-- Imported last to fix redundancy warning
 import           Prelude              hiding (concat, takeWhile)
 
 
@@ -59,7 +59,7 @@
 table = do
     pairs <- (many (assignment <* skipBlanks) <|> (skipBlanks >> return []))
     case maybeDupe (map fst pairs) of
-      Just k  -> fail $ "Cannot redefine key " ++ unpack k
+      Just k  -> throwParser $ "Cannot redefine key " ++ unpack k
       Nothing -> return $ M.fromList pairs
 
 -- | Parses an inline table of key-value pairs.
@@ -67,7 +67,7 @@
 inlineTable = do
     pairs <- between (char '{') (char '}') (skipSpaces *> separatedValues <* skipSpaces)
     case maybeDupe (map fst pairs) of
-      Just k  -> fail $ "Cannot redefine key " ++ (unpack k)
+      Just k  -> throwParser $ "Cannot redefine key " ++ (unpack k)
       Nothing -> return $ VTable $ M.fromList pairs
   where
     skipSpaces      = many (satisfy isSpc)
@@ -133,7 +133,7 @@
     <|> (try datetime    <?> "datetime")
     <|> (try float       <?> "float")
     <|> (try integer     <?> "integer")
-    <|> (try inlineTable <?> "inline table")
+    <|> (inlineTable <?> "inline table")
 
 
 --
@@ -205,7 +205,7 @@
     let  mt = parseTime defaultTimeLocale (iso8601DateFormat $ Just "%X") d
 #endif
     case mt of Just t  -> return $ VDatetime t
-               Nothing -> fail "parsing datetime failed"
+               Nothing -> throwParser "parsing datetime failed"
 
 
 -- | Attoparsec 'double' parses scientific "e" notation; reimplement according to Toml spec.
diff --git a/src/Text/Toml/Types.hs b/src/Text/Toml/Types.hs
--- a/src/Text/Toml/Types.hs
+++ b/src/Text/Toml/Types.hs
@@ -14,6 +14,7 @@
   , Explicitness (..)
   , isExplicit
   , insert
+  , throwParser
   , Toml
   , TomlM
   , Parser
@@ -92,7 +93,7 @@
 insert ex ([name], node) ttbl =
     -- In case 'name' is final (a top-level name)
     case M.lookup name ttbl of
-      Nothing -> do when (isExplicit ex) $ updateExState [name] node
+      Nothing -> do when (isExplicit ex) $ updateExStateOrError [name] node
                     return $ M.insert name node ttbl
       Just (VTable t) -> case node of
           (VTable nt) -> case merge t nt of
@@ -110,7 +111,7 @@
     case M.lookup name ttbl of
       Nothing -> do
           r <- insert Implicit (ns, node) emptyTable
-          when (isExplicit ex) $ updateExState fullName node
+          when (isExplicit ex) $ updateExStateOrError fullName node
           return $ M.insert name (VTable r) ttbl
       Just (VTable t) -> do
           r <- insert Implicit (ns, node) t
