diff --git a/example/Keys.hs.sample b/example/Keys.hs.sample
--- a/example/Keys.hs.sample
+++ b/example/Keys.hs.sample
@@ -70,3 +70,11 @@
                     , oauthOAuthorizeEndpoint = [uri|https://www.dropbox.com/1/oauth2/authorize|]
                     , oauthAccessTokenEndpoint = [uri|https://api.dropboxapi.com/oauth2/token|]
                     }
+
+oktaKey :: OAuth2
+oktaKey = OAuth2 { oauthClientId = "xxx"
+                 , oauthClientSecret = "xxx"
+                 , oauthCallback = Just [uri|http://localhost:9988/oauth2/callback|]
+                 , oauthOAuthorizeEndpoint = [uri|https://dev-148986.oktapreview.com/oauth2/v1/authorize|]
+                 , oauthAccessTokenEndpoint = [uri|https://dev-148986.oktapreview.com/oauth2/v1/token|]
+                 }
diff --git a/example/Okta/test.hs b/example/Okta/test.hs
new file mode 100644
--- /dev/null
+++ b/example/Okta/test.hs
@@ -0,0 +1,47 @@
+{-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE QuasiQuotes       #-}
+
+module Main where
+
+import qualified Data.ByteString.Char8      as BS
+import qualified Data.ByteString.Lazy.Char8 as BSL
+import qualified Data.Text                  as T
+import           Data.Aeson
+import           Data.Aeson.Types
+import           Network.HTTP.Conduit
+import qualified Network.HTTP.Types         as HT
+import           URI.ByteString
+import           GHC.Generics
+import           URI.ByteString.QQ
+
+import           Network.OAuth.OAuth2
+
+import           Keys
+
+data Errors =
+  SomeRandomError
+  deriving (Show, Eq, Generic)
+
+instance FromJSON Errors where
+  parseJSON = genericParseJSON defaultOptions { constructorTagModifier = camelTo2 '_', allNullaryToStringTag = True }
+
+main :: IO ()
+main = do
+    BS.putStrLn
+      $ serializeURIRef'
+      $ appendQueryParams [("scope", "openid profile"), ("state", "test-state-123")]
+      $ authorizationUrl oktaKey
+    putStrLn "visit the url and paste code here: "
+    code <- getLine
+    mgr <- newManager tlsManagerSettings
+    token <- fetchAccessToken mgr oktaKey (ExchangeToken (T.pack code))
+    print token
+    case token of
+      Right at -> getUserInfo mgr (accessToken at) >>= print
+      Left _   -> putStrLn "no access token found yet"
+
+getUserInfo :: Manager -> AccessToken -> IO (OAuth2Result Errors BSL.ByteString)
+getUserInfo mgr token =
+  authGetBS mgr token [uri|https://dev-148986.oktapreview.com/oauth2/v1/userinfo|]
diff --git a/hoauth2.cabal b/hoauth2.cabal
--- a/hoauth2.cabal
+++ b/hoauth2.cabal
@@ -1,6 +1,6 @@
 Name:                hoauth2
 -- http://wiki.haskell.org/Package_versioning_policy
-Version:             1.5.0
+Version:             1.5.1
 
 Synopsis:            Haskell OAuth2 authentication client
 
@@ -260,6 +260,30 @@
     Buildable: False
 
   main-is:             Dropbox/test.hs
+  hs-source-dirs:      example
+  default-language:    Haskell2010
+  build-depends:       base              >= 4.5    && < 5,
+                       http-types        >= 0.9    && < 0.11,
+                       http-conduit      >= 2.1    && < 2.3,
+                       text              >= 0.11   && < 1.3,
+                       bytestring        >= 0.9    && < 0.11,
+                       uri-bytestring    >= 0.2.3.1 && < 0.4,
+                       aeson             >= 0.11   && < 1.3,
+                       hoauth2
+
+  if impl(ghc >= 6.12.0)
+      ghc-options: -Wall -fwarn-tabs -funbox-strict-fields
+                   -fno-warn-unused-do-bind
+  else
+      ghc-options: -Wall -fwarn-tabs -funbox-strict-fields
+
+Executable test-okta
+  if flag(test)
+    Buildable: True
+  else
+    Buildable: False
+
+  main-is:             Okta/test.hs
   hs-source-dirs:      example
   default-language:    Haskell2010
   build-depends:       base              >= 4.5    && < 5,
diff --git a/src/Network/OAuth/OAuth2/HttpClient.hs b/src/Network/OAuth/OAuth2/HttpClient.hs
--- a/src/Network/OAuth/OAuth2/HttpClient.hs
+++ b/src/Network/OAuth/OAuth2/HttpClient.hs
@@ -185,9 +185,9 @@
               => OAuth2Result err BSL.ByteString
               -> OAuth2Result err a
 parseResponseJSON (Left b) = Left b
-parseResponseJSON (Right b) = case decode b of
-                            Nothing -> Left (parseOAuth2Error b)
-                            Just x -> Right x
+parseResponseJSON (Right b) = case eitherDecode b of
+                            Left e -> Left $ mkDecodeOAuth2Error b e
+                            Right x -> Right x
 
 -- | Parses a @OAuth2Result BSL.ByteString@ that contains not JSON but a Query String
 parseResponseString :: FromJSON err => FromJSON a
diff --git a/src/Network/OAuth/OAuth2/Internal.hs b/src/Network/OAuth/OAuth2/Internal.hs
--- a/src/Network/OAuth/OAuth2/Internal.hs
+++ b/src/Network/OAuth/OAuth2/Internal.hs
@@ -88,8 +88,14 @@
 
 parseOAuth2Error :: FromJSON err => BSL.ByteString -> OAuth2Error err
 parseOAuth2Error string =
-  either (\err -> OAuth2Error (Left "Decode error") (Just $ pack $ "Error: " <> err <> "\n Original Response:\n" <> show (decodeUtf8 $ BSL.toStrict string)) Nothing) id (eitherDecode string)
+  either (mkDecodeOAuth2Error string) id (eitherDecode string)
 
+mkDecodeOAuth2Error :: BSL.ByteString -> String -> OAuth2Error err
+mkDecodeOAuth2Error response err =
+  OAuth2Error
+    (Left "Decode error")
+    (Just $ pack $ "Error: " <> err <> "\n Original Response:\n" <> show (decodeUtf8 $ BSL.toStrict response))
+    Nothing
 
 --------------------------------------------------
 -- * Types Synonym
