diff --git a/dotenv.cabal b/dotenv.cabal
--- a/dotenv.cabal
+++ b/dotenv.cabal
@@ -1,5 +1,5 @@
 name:                dotenv
-version:             0.1.0.3
+version:             0.1.0.4
 synopsis:            Loads environment variables from dotenv files
 
 description:
diff --git a/src/Configuration/Dotenv/Parse.hs b/src/Configuration/Dotenv/Parse.hs
--- a/src/Configuration/Dotenv/Parse.hs
+++ b/src/Configuration/Dotenv/Parse.hs
@@ -1,6 +1,6 @@
 module Configuration.Dotenv.Parse (configParser) where
 
-import Text.Parsec ((<|>), anyChar, char, many, manyTill, try)
+import Text.Parsec ((<|>), (<?>), anyChar, char, many, manyTill, try)
 import Text.Parsec.Combinator (eof)
 import Text.Parsec.String (Parser)
 import Text.ParserCombinators.Parsec.Char
@@ -21,47 +21,61 @@
 envLine = (comment <|> blankLine) *> return Nothing <|> Just <$> optionLine
 
 blankLine :: Parser String
-blankLine = many verticalSpace <* newline
+blankLine = many verticalSpace <* newline <?> "blank line"
 
 optionLine :: Parser (String, String)
 optionLine = liftM2 (,)
-  (many verticalSpace *> variableName <* keywordArgSeparator)
-  argumentParser
+  (many verticalSpace *> variableName <* variableValueSeparator)
+  value
 
 -- | Variables must start with a letter or underscore, and may contain
 -- letters, digits or '_' character after the first character.
 variableName :: Parser String
 variableName =
-  liftM2 (:) (letter <|> char '_') (many (letter <|> char '_' <|> digit))
+  liftM2 (:)
 
-argumentParser :: Parser String
-argumentParser = quotedArgument <|> unquotedArgument
+  (letter <|> char '_')
 
-quotedArgument :: Parser String
-quotedArgument = quotedWith '\'' <|> quotedWith '\"'
+  (many
+   (letter <|> char '_' <|> digit <?>
+    unwords
+    [ "valid non-leading shell variable character (alphanumeric, "
+    , "digit or underscore)" ]))
 
-unquotedArgument :: Parser String
-unquotedArgument =
+  <?> unwords [ "shell variable name (letter or underscore followed"
+              , "by alphanumeric characters or underscores)" ]
+
+value :: Parser String
+value = quotedValue <|> unquotedValue <?> "variable value"
+
+quotedValue :: Parser String
+quotedValue = quotedWith '\'' <|> quotedWith '\"'
+              <?> "variable value surrounded with single or double quotes"
+
+unquotedValue :: Parser String
+unquotedValue =
   manyTill anyChar (comment <|> many verticalSpace <* endOfLineOrInput)
 
 -- | Based on a commented-string parser in:
 -- http://hub.darcs.net/navilan/XMonadTasks/raw/Data/Config/Lexer.hs
 quotedWith :: Char -> Parser String
-quotedWith c = char c *> many chr <* char c
+quotedWith c = char c *> many chr <* (char c <?> "closing quote character")
 
   where chr = esc <|> noneOf [c]
-        esc = escape *> char c
+        esc = escape *> char c <?> "escape character"
 
 comment :: Parser String
 comment = try (many verticalSpace *> char '#')
           *> manyTill anyChar endOfLineOrInput
+          <?> "comment"
 
 endOfLineOrInput :: Parser ()
 endOfLineOrInput = newline *> return () <|> eof
 
-keywordArgSeparator :: Parser ()
-keywordArgSeparator =
-  many verticalSpace *> char '=' *> many verticalSpace *> return ()
+variableValueSeparator :: Parser ()
+variableValueSeparator =
+  many verticalSpace *> (char '=' <?> "variable-value separator character (=)")
+  *> many verticalSpace *> return ()
 
 escape :: Parser Char
 escape = char '\\'
