diff --git a/src/Data/URLEncoded.hs b/src/Data/URLEncoded.hs
--- a/src/Data/URLEncoded.hs
+++ b/src/Data/URLEncoded.hs
@@ -51,7 +51,7 @@
     deriving (Monoid, Eq)
 
 class AddURLEncoded a where
-    (%?) :: a -> URLEncoded -> a
+    (%?) :: URLEncode args => a -> args -> a
 infixr 6 %?
 
 instance AddURLEncoded [Char] where
@@ -61,16 +61,16 @@
                             else if '?' `elem` u
                                  then "&"
                                  else "?"
-               in concat [u, joiner, export q, frag]
+               in concat [u, joiner, export $ urlEncode q, frag]
 
 instance AddURLEncoded URI where
-    (%?) = flip addToURI
+    u %? q = addToURI (urlEncode q) u
 
 instance AddURLEncoded URLEncoded where
-    (%?) = mappend
+    q1 %? q2 = q1 `mappend` urlEncode q2
 
-(%&) :: URLEncoded -> URLEncoded -> URLEncoded
-(%&) = mappend
+(%&) :: (URLEncode q1, URLEncode q2) => q1 -> q2 -> URLEncoded
+q1 %& q2 = urlEncode q1 `mappend` urlEncode q2
 infixr 7 %&
 
 -- | Is this URLEncoded data empty?
diff --git a/test/TestDriver.hs b/test/TestDriver.hs
--- a/test/TestDriver.hs
+++ b/test/TestDriver.hs
@@ -92,10 +92,12 @@
 
        , property $ all isAllowedInURI . export
 
-       , property $ \u1 u2 -> (u1 %? u2) == (u1 %& u2)
+       , property $ \u1 u2 ->
+           ((u1::URLEncoded) %? (u2::URLEncoded)) == (u1 %& u2)
 
        , property $ \u ->
-           forAll httpUri $ \uri -> (show (uri %? u)) == (show uri %? u)
+           forAll httpUri $ \uri ->
+               (show (uri %? (u::URLEncoded))) == (show uri %? u)
 
        , forAll (two arbitraryQueryArg) $ \(a, b) -> pairs (a %= b) == [(a, b)]
 
diff --git a/urlencoded.cabal b/urlencoded.cabal
--- a/urlencoded.cabal
+++ b/urlencoded.cabal
@@ -1,6 +1,6 @@
 name:                urlencoded
 Cabal-Version:       >= 1.6
-version:             0.1.0.1
+version:             0.2.0.0
 synopsis:            Generate or process x-www-urlencoded data
 
 description:         Generate or process x-www-urlencoded data as it
