diff --git a/Benchs/PregenKeys.hs b/Benchs/PregenKeys.hs
--- a/Benchs/PregenKeys.hs
+++ b/Benchs/PregenKeys.hs
@@ -20,7 +20,7 @@
     , RSA.public_e    = 65537
     }
 
-dsaParams = (p,g,q)
+dsaParams = DSA.Params { DSA.params_p = p, DSA.params_g = g, DSA.params_q = q }
     where
         p = 0x00a8c44d7d0bbce69a39008948604b9c7b11951993a5a1a1fa995968da8bb27ad9101c5184bcde7c14fb79f7562a45791c3d80396cefb328e3e291932a17e22edd
         g = 0x0bf9fe6c75d2367b88912b2252d20fdcad06b3f3a234b92863a1e30a96a123afd8e8a4b1dd953e6f5583ef8e48fc7f47a6a1c8f24184c76dba577f0fec2fcd1c
diff --git a/Crypto/PubKey/DH.hs b/Crypto/PubKey/DH.hs
--- a/Crypto/PubKey/DH.hs
+++ b/Crypto/PubKey/DH.hs
@@ -8,7 +8,7 @@
 -- Portability : Good
 --
 module Crypto.PubKey.DH
-    ( Params
+    ( Params(..)
     , PublicNumber
     , PrivateNumber
     , SharedKey
@@ -29,7 +29,7 @@
 -- we generate a safe prime (a prime number of the form 2p+1 where p is also prime)
 generateParams :: CPRG g => g -> Int -> Integer -> (Params, g)
 generateParams rng bits generator =
-    first (\p -> (p, generator)) $ generateSafePrime rng bits
+    first (\p -> Params p generator) $ generateSafePrime rng bits
 
 -- | generate a private number with no specific property
 -- this number is usually called X in DH text.
@@ -39,8 +39,8 @@
 -- | generate a public number that is for the other party benefits.
 -- this number is usually called Y in DH text.
 generatePublic :: Params -> PrivateNumber -> PublicNumber
-generatePublic (p,g) (PrivateNumber x) = PublicNumber $ exponantiation g x p
+generatePublic (Params p g) (PrivateNumber x) = PublicNumber $ exponantiation g x p
 
 -- | generate a shared key using our private number and the other party public number
 getShared :: Params -> PrivateNumber -> PublicNumber -> SharedKey
-getShared (p,_) (PrivateNumber x) (PublicNumber y) = SharedKey $ exponantiation y x p
+getShared (Params p _) (PrivateNumber x) (PublicNumber y) = SharedKey $ exponantiation y x p
diff --git a/Crypto/PubKey/DSA.hs b/Crypto/PubKey/DSA.hs
--- a/Crypto/PubKey/DSA.hs
+++ b/Crypto/PubKey/DSA.hs
@@ -7,7 +7,7 @@
 --
 
 module Crypto.PubKey.DSA
-    ( Params
+    ( Params(..)
     , Signature
     , PublicKey(..)
     , PrivateKey(..)
@@ -37,7 +37,7 @@
     | r == 0 || s == 0  = Nothing
     | otherwise         = Just (r,s)
     where -- parameters
-          (p,g,q)   = private_params pk
+          (Params p g q) = private_params pk
           x         = private_x pk
           -- compute r,s
           kInv      = fromJust $ inverse k q
@@ -51,7 +51,7 @@
     case signWith k pk hash msg of
         Nothing  -> sign rng' pk hash msg
         Just sig -> (sig, rng')
-    where (_,_,q)   = private_params pk
+    where (Params _ _ q) = private_params pk
           (k, rng') = generateMax rng q
 
 -- | verify a bytestring using the public key.
@@ -60,7 +60,7 @@
     -- Reject the signature if either 0 < r < q or 0 < s < q is not satisfied.
     | r <= 0 || r >= q || s <= 0 || s >= q = False
     | otherwise                            = v == r
-    where (p,g,q) = public_params pk
+    where (Params p g q) = public_params pk
           y       = public_y pk
           hm      = os2ip $ hash m
 
diff --git a/Crypto/PubKey/ElGamal.hs b/Crypto/PubKey/ElGamal.hs
--- a/Crypto/PubKey/ElGamal.hs
+++ b/Crypto/PubKey/ElGamal.hs
@@ -66,12 +66,12 @@
 -- | generate a public number that is for the other party benefits.
 -- this number is usually called h=g^a
 generatePublic :: Params -> PrivateNumber -> PublicNumber
-generatePublic (p,g) (PrivateNumber a) = PublicNumber $ exponantiation g a p
+generatePublic (Params p g) (PrivateNumber a) = PublicNumber $ exponantiation g a p
 
 -- | encrypt with a specified ephemeral key
 -- do not reuse ephemeral key.
 encryptWith :: EphemeralKey -> Params -> PublicNumber -> Integer -> (Integer,Integer)
-encryptWith (EphemeralKey b) (p,g) (PublicNumber h) m = (c1,c2)
+encryptWith (EphemeralKey b) (Params p g) (PublicNumber h) m = (c1,c2)
     where s  = exponantiation h b p
           c1 = exponantiation g b p
           c2 = (s * m) `mod` p
@@ -79,12 +79,12 @@
 -- | encrypt a message using params and public keys
 -- will generate b (called the ephemeral key)
 encrypt :: CPRG g => g -> Params -> PublicNumber -> Integer -> ((Integer,Integer), g)
-encrypt rng params@(p,_) public m = first (\b -> encryptWith b params public m) $ generateEphemeral rng q
+encrypt rng params@(Params p _) public m = first (\b -> encryptWith b params public m) $ generateEphemeral rng q
     where q = p-1 -- p is prime, hence order of the group is p-1
 
 -- | decrypt message
 decrypt :: Params -> PrivateNumber -> (Integer, Integer) -> Integer
-decrypt (p,_) (PrivateNumber a) (c1,c2) = (c2 * sm1) `mod` p
+decrypt (Params p _) (PrivateNumber a) (c1,c2) = (c2 * sm1) `mod` p
     where s   = exponantiation c1 a p
           sm1 = fromJust $ inverse s p -- always inversible in Zp
 
@@ -101,7 +101,7 @@
          -> HashFunction    -- ^ collision resistant hash function
          -> ByteString      -- ^ message to sign
          -> Maybe Signature
-signWith k (p,g) (PrivateNumber x) hashF msg
+signWith k (Params p g) (PrivateNumber x) hashF msg
     | k >= p-1 || d > 1 = Nothing -- gcd(k,p-1) is not 1
     | s == 0            = Nothing
     | otherwise         = Just $ Signature (r,s)
@@ -123,7 +123,7 @@
      -> HashFunction   -- ^ collision resistant hash function
      -> ByteString     -- ^ message to sign
      -> (Signature, g)
-sign rng params@(p,_) priv hashF msg =
+sign rng params@(Params p _) priv hashF msg =
     let (k, rng') = generateMax rng (p-1)
      in case signWith k params priv hashF msg of
              Nothing  -> sign rng' params priv hashF msg
@@ -136,7 +136,7 @@
        -> ByteString
        -> Signature
        -> Bool
-verify (p,g) (PublicNumber y) hashF msg (Signature (r,s))
+verify (Params p g) (PublicNumber y) hashF msg (Signature (r,s))
     | or [r <= 0,r >= p,s <= 0,s >= (p-1)] = False
     | otherwise                            = lhs == rhs
     where h   = os2ip $ hashF msg
diff --git a/Tests/KAT/DSA.hs b/Tests/KAT/DSA.hs
--- a/Tests/KAT/DSA.hs
+++ b/Tests/KAT/DSA.hs
@@ -115,7 +115,11 @@
         } 
     ]
     where -- (p,g,q)
-          dsaParams = (0xa8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5ebe2d1229681b5b06439ac9c7e9d8bde283,0x2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a3a99bbe089216368171bd0ba81de4fe33, 0xf85f0f83ac4df7ea0cdf8f469bfeeaea14156495)
+          dsaParams = DSA.Params
+            { DSA.params_p = 0xa8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5ebe2d1229681b5b06439ac9c7e9d8bde283
+            , DSA.params_g = 0x2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a3a99bbe089216368171bd0ba81de4fe33
+            , DSA.params_q = 0xf85f0f83ac4df7ea0cdf8f469bfeeaea14156495
+            }
 
 vectorToPrivate :: VectorDSA -> DSA.PrivateKey
 vectorToPrivate vector = DSA.PrivateKey
diff --git a/Tests/PregenKeys.hs b/Tests/PregenKeys.hs
--- a/Tests/PregenKeys.hs
+++ b/Tests/PregenKeys.hs
@@ -20,7 +20,7 @@
     , RSA.public_e    = 65537
     }
 
-dsaParams = (p,g,q)
+dsaParams = DSA.Params { DSA.params_p = p, DSA.params_g = g, DSA.params_q = q }
     where
         p = 0x00a8c44d7d0bbce69a39008948604b9c7b11951993a5a1a1fa995968da8bb27ad9101c5184bcde7c14fb79f7562a45791c3d80396cefb328e3e291932a17e22edd
         g = 0x0bf9fe6c75d2367b88912b2252d20fdcad06b3f3a234b92863a1e30a96a123afd8e8a4b1dd953e6f5583ef8e48fc7f47a6a1c8f24184c76dba577f0fec2fcd1c
diff --git a/Tests/Tests.hs b/Tests/Tests.hs
--- a/Tests/Tests.hs
+++ b/Tests/Tests.hs
@@ -125,7 +125,7 @@
         sb = DH.getShared dhparams xb ya
         yb = DH.generatePublic dhparams xb
         ya = DH.generatePublic dhparams xa
-        dhparams = (11, 7)
+        dhparams = DH.Params { DH.params_p = 11, DH.params_g = 7 }
 
 
 asymEncryptionTests = testGroup "assymmetric cipher encryption"
diff --git a/crypto-pubkey.cabal b/crypto-pubkey.cabal
--- a/crypto-pubkey.cabal
+++ b/crypto-pubkey.cabal
@@ -1,5 +1,5 @@
 Name:                crypto-pubkey
-Version:             0.1.2
+Version:             0.1.3
 Description:
     Public Key cryptography
     .
@@ -28,7 +28,7 @@
   Build-Depends:     base >= 4 && < 5
                    , bytestring
                    , crypto-random-api >= 0.2 && < 0.3
-                   , crypto-pubkey-types >= 0.2 && < 0.3
+                   , crypto-pubkey-types >= 0.3 && < 0.4
                    , cryptohash >= 0.8
                    , crypto-numbers
   Exposed-modules:   Crypto.PubKey.RSA
