diff --git a/haskell/src/Crypto/Secp256k1.hs b/haskell/src/Crypto/Secp256k1.hs
--- a/haskell/src/Crypto/Secp256k1.hs
+++ b/haskell/src/Crypto/Secp256k1.hs
@@ -56,14 +56,11 @@
     , combinePubKeys
     ) where
 
-import           Control.Applicative
 import           Control.Monad
 import           Crypto.Secp256k1.Internal
-import qualified Data.Binary               as Bin
 import           Data.ByteString           (ByteString)
 import qualified Data.ByteString           as BS
 import qualified Data.ByteString.Base16    as B16
-import qualified Data.ByteString.Lazy      as BL
 import           Data.Maybe
 import           Data.String
 import           Data.String.Conversions
@@ -111,7 +108,7 @@
         maybe pfail return $ msg =<< decodeHex str
 
 instance IsString Msg where
-    fromString = fromJust . msg . fromJust . decodeHex
+    fromString = fromJust . (msg <=< decodeHex) 
 
 instance Show Msg where
     showsPrec d m = showParen (d > 10) $
@@ -124,12 +121,7 @@
         maybe pfail return $ importSig =<< decodeHex str
 
 instance IsString Sig where
-    fromString hex = fromJust $ der <|> compact
-      where
-        compact = do
-            c <- (Bin.decode . BL.fromStrict) <$> decodeHex hex
-            importCompactSig c
-        der = importSig =<< decodeHex hex
+    fromString = fromJust . (importSig <=< decodeHex) 
 
 instance Show Sig where
     showsPrec d s = showParen (d > 10) $
@@ -142,8 +134,7 @@
         maybe pfail return $ secKey =<< decodeHex str
 
 instance IsString SecKey where
-    fromString str = fromJust $
-        (secKey =<< decodeHex str) <|> (importSecKey =<< decodeHex str)
+    fromString = fromJust . (secKey <=< decodeHex)
 
 instance Show SecKey where
     showsPrec d k = showParen (d > 10) $
diff --git a/haskell/src/Crypto/Secp256k1/Internal.hs b/haskell/src/Crypto/Secp256k1/Internal.hs
--- a/haskell/src/Crypto/Secp256k1/Internal.hs
+++ b/haskell/src/Crypto/Secp256k1/Internal.hs
@@ -122,9 +122,9 @@
 
 instance Binary CompactSig where
     get = do
-        LargeKey r s <- get
+        LargeKey s r <- get
         return $ CompactSig r s
-    put (CompactSig r s) = put (LargeKey r s)
+    put (CompactSig r s) = put (LargeKey s r)
 
 instance Storable Msg32 where
     sizeOf _ = 32
diff --git a/haskell/test/Crypto/Secp256k1/Tests.hs b/haskell/test/Crypto/Secp256k1/Tests.hs
--- a/haskell/test/Crypto/Secp256k1/Tests.hs
+++ b/haskell/test/Crypto/Secp256k1/Tests.hs
@@ -34,7 +34,6 @@
         , testProperty "String public key" isStringPubKey
         , testProperty "String secret key" isStringSecKey
         , testProperty "String signature" isStringSig
-        , testProperty "String compact signature" isStringCompactSig
         , testProperty "String message" isStringMsg
         , testProperty "String tweak" isStringTweak
         ]
@@ -55,11 +54,6 @@
 isStringSig (k, m) = g == fromString (cs hex) where
     g = signMsg k m
     hex = B16.encode $ exportSig g
-
-isStringCompactSig :: (SecKey, Msg) -> Bool
-isStringCompactSig (k, m) = g == fromString (cs hex) where
-    g = signMsg k m
-    hex = B16.encode . BL.toStrict . Bin.encode $ exportCompactSig g
 
 isStringMsg :: Msg -> Bool
 isStringMsg m = m == fromString (cs m') where
diff --git a/secp256k1.cabal b/secp256k1.cabal
--- a/secp256k1.cabal
+++ b/secp256k1.cabal
@@ -1,5 +1,5 @@
 name:                secp256k1
-version:             0.3.2
+version:             0.4.0
 synopsis:            secp256k1 bindings for Haskell
 description:         Please see README.md
 homepage:            http://github.com/haskoin/secp256k1#readme
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -8,7 +8,7 @@
 - '.'
 
 # Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3)
-extra-deps: []
+extra-deps: [largeword-1.2.4]
 
 # Override default flag values for local packages and extra-deps
 flags: {}
