diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,13 @@
+# Version 0.3
+
+- Support of `secp256k1-haskell-0.5`
+
+- Removed `toSha256` and `Sha256` redundant exports
+
+- Moved `sign` and `verify` out of the `Signable` class
+
+- Function `sign` output is `Sig` instead of `Maybe Sig`
+
 # Version 0.2
 
 - Field indexes of any unset field (message/repeated/oneof) are ignored in serialized payload to make possible rolling upgrades **BREAKING CHANGE**
diff --git a/signable.cabal b/signable.cabal
--- a/signable.cabal
+++ b/signable.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 96e4ab3b538617261b6805fe5eadfa87a8bffa2b67f0f684e7942568405df0e8
+-- hash: d2dec01d6000877a395f9d10ab73143cd8321afc169632f2e8756c037b851444
 
 name:           signable
-version:        0.2
+version:        0.3
 synopsis:       Deterministic serialisation and signatures with proto-lens support
 description:    You can find documentation at <https://hackage.haskell.org/package/signable/docs/Data-Signable.html hackage>
 category:       Data, Cryptography
@@ -52,7 +52,7 @@
     , pem >=0.2.4 && <0.3
     , proto-lens >=0.7.0 && <0.8
     , proto-lens-runtime >=0.7.0 && <0.8
-    , secp256k1-haskell >=0.4 && <0.5
+    , secp256k1-haskell >=0.4 && <0.6
     , text >=1.2.3 && <1.3
     , universum >=1.5.0 && <1.6
   default-language: Haskell2010
@@ -106,7 +106,7 @@
     , proto-lens-arbitrary >=0.1.2 && <0.2
     , proto-lens-runtime >=0.7.0 && <0.8
     , quickcheck-instances >=0.3.22 && <0.4
-    , secp256k1-haskell >=0.4 && <0.5
+    , secp256k1-haskell >=0.4 && <0.6
     , signable
     , text >=1.2.3 && <1.3
     , universum >=1.5.0 && <1.6
diff --git a/src/Data/Signable/Class.hs b/src/Data/Signable/Class.hs
--- a/src/Data/Signable/Class.hs
+++ b/src/Data/Signable/Class.hs
@@ -16,17 +16,21 @@
     exportPrvKeyRaw,
     newRandomPrvKey,
 
-    -- * Sha256
-    Sha256 (..),
-
     -- * Signature
     Sig,
+    sign,
+    verify,
     importSigDer,
     exportSigDer,
 
     -- * Class
     Signable (..),
 
+    -- * Util
+    pubKey2Alg,
+    prvKey2Alg,
+    sig2Alg,
+
     -- * Misc
     Alg (..),
     SignableError (..),
@@ -81,10 +85,15 @@
 instance Show Sig where
   show = const "SECRET"
 
---
--- TODO : add KeyKind argument later
--- when we will have more algorithms
---
+pubKey2Alg :: PubKey -> Alg
+pubKey2Alg (PubKeySecp256k1 _) = AlgSecp256k1
+
+prvKey2Alg :: PrvKey -> Alg
+prvKey2Alg (PrvKeySecp256k1 _) = AlgSecp256k1
+
+sig2Alg :: Sig -> Alg
+sig2Alg (SigSecp256k1 _) = AlgSecp256k1
+
 importPubKeyDer :: Alg -> ByteString -> Maybe PubKey
 importPubKeyDer AlgSecp256k1 = (PubKeySecp256k1 <$>) . C.importPubKey
 
@@ -157,25 +166,27 @@
 
 class Signable a where
   toBinary :: a -> BL.ByteString
-  toSha256 :: a -> Sha256
-  toSha256 =
-    Sha256
-      . BS.pack
-      . BA.unpack
-      . (hashlazy :: BL.ByteString -> Digest SHA256)
-      . toBinary
-  sign :: PrvKey -> a -> Maybe Sig
-  sign (PrvKeySecp256k1 k) =
-    (SigSecp256k1 . C.signMsg k <$>)
-      . C.msg
-      . coerce
-      . toSha256
-  verify :: PubKey -> Sig -> a -> Bool
-  verify (PubKeySecp256k1 k) (SigSecp256k1 s) =
-    maybe False (C.verifySig k s)
-      . C.msg
-      . coerce
-      . toSha256
+
+toSha256 :: Signable a => a -> Sha256
+toSha256 =
+  Sha256
+    . BS.pack
+    . BA.unpack
+    . (hashlazy :: BL.ByteString -> Digest SHA256)
+    . toBinary
+
+sign :: Signable a => PrvKey -> a -> Sig
+sign (PrvKeySecp256k1 k) x0 =
+  case C.msg . coerce $ toSha256 x0 of
+    Just x -> SigSecp256k1 $ C.signMsg k x
+    Nothing -> error "SECP256K1_MSG_CONS_IMPOSSIBLE_FAILURE"
+
+verify :: Signable a => PubKey -> Sig -> a -> Bool
+verify (PubKeySecp256k1 k) (SigSecp256k1 s) =
+  maybe False (C.verifySig k s)
+    . C.msg
+    . coerce
+    . toSha256
 
 instance Signable ByteString where
   toBinary = BL.drop 8 . B.encode
diff --git a/test/Proto/SignableOrphan.hs b/test/Proto/SignableOrphan.hs
--- a/test/Proto/SignableOrphan.hs
+++ b/test/Proto/SignableOrphan.hs
@@ -1,6 +1,8 @@
 {- This file was auto-generated by the signable-haskell-protoc program. -}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
 {-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 module Proto.SignableOrphan (
     ) where
diff --git a/test/SignableSpec.hs b/test/SignableSpec.hs
--- a/test/SignableSpec.hs
+++ b/test/SignableSpec.hs
@@ -19,21 +19,13 @@
   it "is able to sign proto message" $
     \k -> property $ \x0 ->
       sign k (unArbitraryMessage x0 :: Payload)
-        `shouldSatisfy` isJust
+        `shouldSatisfy` const True
   it "is able to verify valid proto message signature" $
     \k -> property $ \x0 -> do
       let x :: Payload = unArbitraryMessage x0
-      maybe
-        False
-        (\s -> verify (derivePubKey k) s x)
-        (sign k x)
-        `shouldBe` True
+      verify (derivePubKey k) (sign k x) x `shouldBe` True
   it "is able to discard invalid proto message signature" $
     \k -> property $ \x0 -> do
       let x :: Payload = unArbitraryMessage x0
       let y = x & (amount . amount) +~ 1
-      maybe
-        False
-        (\s -> verify (derivePubKey k) s y)
-        (sign k x)
-        `shouldBe` False
+      verify (derivePubKey k) (sign k x) y `shouldBe` False
diff --git a/test/TestCaseSpec.hs b/test/TestCaseSpec.hs
--- a/test/TestCaseSpec.hs
+++ b/test/TestCaseSpec.hs
@@ -50,34 +50,47 @@
         ( \tc -> do
             let t = tcProtoType tc
             let x = coerce $ tcProtoBin tc
-            s <- case importSigDer AlgSecp256k1 . coerce $ tcSignatureBin tc of
+            s <- case importSigDer AlgSecp256k1 . coerce $
+              tcSignatureBin tc of
               Just s0 -> return s0
               Nothing -> fail "INVALID_SIG"
             --putStrLn $ tcDescription tc
             (BL.unpack <$> serializer t x)
-              `shouldBe` (Right . BL.unpack . coerce $ tcSignableBin tc)
+              `shouldBe` ( Right
+                             . BL.unpack
+                             . coerce
+                             $ tcSignableBin tc
+                         )
             verifier pub s t x
               `shouldBe` Right True
         )
         $ envTCS env
     serializer = \case
       Basic'Payload ->
-        ((toBinary :: Proto.Basic.Payload -> BL.ByteString) <$>) . decodeMessage
+        ((toBinary :: Proto.Basic.Payload -> BL.ByteString) <$>)
+          . decodeMessage
       Text'Payload ->
-        ((toBinary :: Proto.Text.Payload -> BL.ByteString) <$>) . decodeMessage
+        ((toBinary :: Proto.Text.Payload -> BL.ByteString) <$>)
+          . decodeMessage
       Number'Payload ->
-        ((toBinary :: Proto.Number.Payload -> BL.ByteString) <$>) . decodeMessage
+        ((toBinary :: Proto.Number.Payload -> BL.ByteString) <$>)
+          . decodeMessage
       Coins'Request ->
-        ((toBinary :: Proto.Coins.Request -> BL.ByteString) <$>) . decodeMessage
+        ((toBinary :: Proto.Coins.Request -> BL.ByteString) <$>)
+          . decodeMessage
     verifier pub s = \case
       Basic'Payload ->
-        ((verify pub s :: Proto.Basic.Payload -> Bool) <$>) . decodeMessage
+        ((verify pub s :: Proto.Basic.Payload -> Bool) <$>)
+          . decodeMessage
       Text'Payload ->
-        ((verify pub s :: Proto.Text.Payload -> Bool) <$>) . decodeMessage
+        ((verify pub s :: Proto.Text.Payload -> Bool) <$>)
+          . decodeMessage
       Number'Payload ->
-        ((verify pub s :: Proto.Number.Payload -> Bool) <$>) . decodeMessage
+        ((verify pub s :: Proto.Number.Payload -> Bool) <$>)
+          . decodeMessage
       Coins'Request ->
-        ((verify pub s :: Proto.Coins.Request -> Bool) <$>) . decodeMessage
+        ((verify pub s :: Proto.Coins.Request -> Bool) <$>)
+          . decodeMessage
 
 genTestCase :: PrvKey -> Int -> ProtoType -> Gen TestCase
 genTestCase prv i t =
@@ -85,12 +98,12 @@
     Basic'Payload -> do
       x <-
         unArbitraryMessage
-          <$> (arbitrary :: Gen (ArbitraryMessage Proto.Basic.Payload))
+          <$> ( arbitrary ::
+                  Gen (ArbitraryMessage Proto.Basic.Payload)
+              )
       let pb = encodeMessage x
       let sb = toBinary x
-      sig <- case exportSigDer <$> sign prv x of
-        Nothing -> error "SIGNATURE_FAILURE"
-        Just s -> return s
+      let sig = exportSigDer $ sign prv x
       return $
         TestCase
           { tcProtoType = t,
@@ -102,12 +115,12 @@
     Text'Payload -> do
       x <-
         unArbitraryMessage
-          <$> (arbitrary :: Gen (ArbitraryMessage Proto.Text.Payload))
+          <$> ( arbitrary ::
+                  Gen (ArbitraryMessage Proto.Text.Payload)
+              )
       let pb = encodeMessage x
       let sb = toBinary x
-      sig <- case exportSigDer <$> sign prv x of
-        Nothing -> error "SIGNATURE_FAILURE"
-        Just s -> return s
+      let sig = exportSigDer $ sign prv x
       return $
         TestCase
           { tcProtoType = t,
@@ -119,12 +132,12 @@
     Number'Payload -> do
       x <-
         unArbitraryMessage
-          <$> (arbitrary :: Gen (ArbitraryMessage Proto.Number.Payload))
+          <$> ( arbitrary ::
+                  Gen (ArbitraryMessage Proto.Number.Payload)
+              )
       let pb = encodeMessage x
       let sb = toBinary x
-      sig <- case exportSigDer <$> sign prv x of
-        Nothing -> error "SIGNATURE_FAILURE"
-        Just s -> return s
+      let sig = exportSigDer $ sign prv x
       return $
         TestCase
           { tcProtoType = t,
@@ -136,12 +149,12 @@
     Coins'Request -> do
       x <-
         unArbitraryMessage
-          <$> (arbitrary :: Gen (ArbitraryMessage Proto.Coins.Request))
+          <$> ( arbitrary ::
+                  Gen (ArbitraryMessage Proto.Coins.Request)
+              )
       let pb = encodeMessage x
       let sb = toBinary x
-      sig <- case exportSigDer <$> sign prv x of
-        Nothing -> error "SIGNATURE_FAILURE"
-        Just s -> return s
+      let sig = exportSigDer $ sign prv x
       return $
         TestCase
           { tcProtoType = t,
