diff --git a/attoparsec-parsec.cabal b/attoparsec-parsec.cabal
--- a/attoparsec-parsec.cabal
+++ b/attoparsec-parsec.cabal
@@ -1,5 +1,5 @@
 name:             attoparsec-parsec
-version:          0.0.2
+version:          0.1.1
 license:          MIT
 license-file:     LICENSE
 copyright:        (c) 2011, 2012 Simon Hengel
@@ -60,7 +60,7 @@
       base
     , attoparsec-parsec
     , text
-    , hspec >= 1.3
+    , hspec >= 1.5
     , QuickCheck
 
 test-suite readme-parsec
diff --git a/src/Data/Attoparsec/Text/Parsec.hs b/src/Data/Attoparsec/Text/Parsec.hs
--- a/src/Data/Attoparsec/Text/Parsec.hs
+++ b/src/Data/Attoparsec/Text/Parsec.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 -- |
 -- This module implements "Data.Attoparsec.Text" in terms of Parsec.  It can be
 -- used to write parsers that can be compiled against both Attoparsec and
@@ -99,7 +101,7 @@
 
 -- * Numeric parsers
 , decimal
--- , hexadecimal
+, hexadecimal
 -- , signed
 -- , double
 -- , Number(..)
@@ -113,6 +115,7 @@
 
 import           Prelude hiding (take, takeWhile)
 import           Data.Char
+import           Data.String (IsString (..))
 import           Data.Text   (Text)
 import qualified Data.Text as Text
 import qualified Data.Text.Lazy as L
@@ -128,6 +131,9 @@
 parseOnly :: Parser a -> Text -> Either String a
 parseOnly p = either (Left . show) (Right) . Parsec.parse p ""
 
+instance (a ~ Text) => IsString (Parser a) where
+  fromString = fmap Text.pack . Parsec.string
+
 -- |
 -- Name the parser, in case failure occurs.
 --
@@ -258,11 +264,17 @@
 
 -- | Parse and decode an unsigned decimal number.
 decimal :: Integral a => Parser a
-decimal = Text.foldl' step 0 `fmap` takeWhile1 isDecimal
+decimal = Text.foldl' step 0 `fmap` takeWhile1 isDigit
   where step a c = a * 10 + fromIntegral (ord c - 48)
 
-isDecimal :: Char -> Bool
-isDecimal c = c >= '0' && c <= '9'
+--
+-- | Parse and decode an unsigned hexadecimal number.
+hexadecimal :: Integral a => Parser a
+hexadecimal= Text.foldl' step 0 `fmap` takeWhile1 isHexDigit
+  where step a c = a * 16 + hexDigit c
+        hexDigit c
+          | isLetter c = fromIntegral . (+(-87)) . ord . toLower $ c
+          | otherwise  = fromIntegral (ord c - 48)
 
 -- | Match only if all input has been consumed.
 endOfInput :: Parser ()
