diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,14 @@
+See also http://pvp.haskell.org/faq
+
+# 0.2.0.0
+
+* Semantic change: Switch to `base64-bytestring-0.2.0` which
+  provides stricter Base64 decoding semantics regarding padding.
+
+* Add support for encoding/decoding to/from unpadded `base64url`.
+
+----
+
+# 0.1.0.0
+
+* First version. Released on an unsuspecting world.
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/base-encoding.cabal b/base-encoding.cabal
--- a/base-encoding.cabal
+++ b/base-encoding.cabal
@@ -1,15 +1,14 @@
-cabal-version:       1.12
+cabal-version:       2.2
 name:                base-encoding
-version:             0.1.0.0
+version:             0.2.0.0
 
 synopsis:            Binary-to-text encodings (e.g. base64)
-license:             BSD3
+license:             BSD-3-Clause
 license-file:        LICENSE
 author:              Herbert Valerio Riedel
 bug-reports:         https://github.com/hvr/base-encoding/issues
 maintainer:          hvr@gnu.org
-category:            Text
-build-type:          Simple
+category:            Codec, Text
 description:
   This package provides a simple and convenient API to encode and
   decode binary data in the popular binary-to-text \"base\" encoding
@@ -17,10 +16,14 @@
   .
   Currently, the following encodings are supported:
   .
-  - base16 (RFC4648)
-  - base64 (RFC4648)
-  - base64url (RFC4648)
+  - (unpadded) @base16@ (RFC4648)
+  - (padded) @base64@ (RFC4648)
+  - padded @base64url@ (RFC4648)
+  - unpadded @base64url@ (RFC4648)
+  .
 
+extra-source-files: ChangeLog.md
+
 source-repository head
   type:     git
   location: https://github.com/hvr/base-encoding
@@ -32,6 +35,7 @@
     Codec.Base16
     Codec.Base64
     Codec.Base64Url
+    Codec.Base64Url.Unpadded
 
   other-modules:
     Internal
@@ -45,11 +49,11 @@
       ghc-options: -fno-warn-trustworthy-safe
 
   build-depends:
-      base               >=4.3      && <4.12
-    , base16-bytestring  >=0.1.1.6  && <0.2
-    , base64-bytestring  >=1.0.0.1  && <1.1
+    , base                >=4.3      && <4.15
+    , base16-bytestring  ^>=0.1.1.6
+    , base64-bytestring  ^>=1.1.0.0
 
-    , bytestring         >=0.9.1    && <0.11
-    , text               >=1.2.3    && <1.3
+    , bytestring         ^>=0.9.1 || ^>= 0.10.0
+    , text               ^>=1.2.3
 
   ghc-options: -Wall
diff --git a/src/Codec/Base64Url.hs b/src/Codec/Base64Url.hs
--- a/src/Codec/Base64Url.hs
+++ b/src/Codec/Base64Url.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE CPP                   #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 
--- | This module provides access to the \"base64url\" binary-to-text encoding as defined by [RFC 4648](https://tools.ietf.org/html/rfc4648).
+-- | This module provides access to the /padded/ \"base64url\" binary-to-text encoding as defined by [RFC 4648](https://tools.ietf.org/html/rfc4648). See also "Codec.Base64Url.Unpadded" for the /unpadded/ encoding variant.
 --
 -- This module is intended to be imported @qualified@, e.g.
 --
@@ -56,10 +56,10 @@
 -- primitives
 
 decodeBs2Bs :: BS.ByteString -> Either String BS.ByteString
-decodeBs2Bs = B64.decode
+decodeBs2Bs = B64.decodePadded
 
 decodeBsL2BsL :: BS.L.ByteString -> Either String BS.L.ByteString
-decodeBsL2BsL = B64.L.decode
+decodeBsL2BsL = B64.L.decodePadded
 
 encodeBs2Bs :: BS.ByteString -> BS.ByteString
 encodeBs2Bs = B64.encode
@@ -70,14 +70,14 @@
 ----------------------------------------------------------------------------
 -- exposed API
 
--- | Typeclass representing types for which a binary-to-text @base64url@ encoding is defined
+-- | Typeclass representing types for which a binary-to-text /padded/ @base64url@ encoding is defined
 class Encode bin txt where
-  -- | Encode binary data using @base64url@ text encoding
+  -- | Encode binary data using /padded/ @base64url@ text encoding
   encode :: bin -> txt
 
--- | Typeclass representing types for which a text-to-binary @base64url@ decoding is defined
+-- | Typeclass representing types for which a text-to-binary /padded/ @base64url@ decoding is defined
 class Decode txt bin where
-  -- | Decode binary data encoded textually as @base64url@
+  -- | Decode binary data encoded textually as /padded/ @base64url@
   decode :: txt -> Either String bin
 
 ----------------------------------------------------------------------------
diff --git a/src/Codec/Base64Url/Unpadded.hs b/src/Codec/Base64Url/Unpadded.hs
new file mode 100644
--- /dev/null
+++ b/src/Codec/Base64Url/Unpadded.hs
@@ -0,0 +1,326 @@
+{-# LANGUAGE CPP                   #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+-- | This module provides access to the /unpadded/ \"base64url\" binary-to-text encoding as defined by [RFC 4648](https://tools.ietf.org/html/rfc4648). See also "Codec.Base64Url" for the /padded/ encoding variant.
+--
+-- This module is intended to be imported @qualified@, e.g.
+--
+-- > import qualified Codec.Base64Url.Unpadded as B64
+--
+-- If you want to explictly specify which 'Encode' and 'Decode' typeclass instance is used, you can use plain Haskell2010 type-signature annotations, e.g.
+--
+-- >>> (B64.encode :: ByteString -> Text) "\x00\x00"
+-- "AAA"
+--
+-- >>> (B64.decode :: Text -> Either String ShortByteString) "NDoyMA"
+-- Right "4:20"
+--
+-- Alternatively, starting with GHC 8.0.1, you can also use the [TypeApplications language extension](https://downloads.haskell.org/~ghc/8.4.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeApplications):
+--
+-- >>> B64.encode @ShortByteString @Text "\xFF\239"
+-- "_-8"
+--
+-- >>> B64.decode @Text @ShortByteString "_-8"
+-- Right "\255\239"
+--
+-- @since 0.2.0.0
+module Codec.Base64Url.Unpadded
+    ( Encode(encode)
+    , Decode(decode)
+    ) where
+
+import qualified Data.ByteString.Base64.URL      as B64
+import qualified Data.ByteString.Base64.URL.Lazy as B64.L
+
+import qualified Data.ByteString                 as BS
+#if MIN_VERSION_bytestring(0,10,2)
+import qualified Data.ByteString.Builder         as BB
+#elif MIN_VERSION_bytestring(0,10,0)
+import qualified Data.ByteString.Lazy.Builder    as BB
+#endif
+import qualified Data.ByteString.Lazy            as BS.L
+#if MIN_VERSION_bytestring(0,10,4)
+import qualified Data.ByteString.Short           as SBS
+#endif
+
+import qualified Data.Text                       as T (Text)
+import qualified Data.Text.Encoding              as T (decodeLatin1, encodeUtf8)
+import qualified Data.Text.Lazy                  as T.L (Text, fromStrict)
+import qualified Data.Text.Lazy.Builder          as TB (Builder, fromLazyText,
+                                                        fromText, toLazyText)
+import qualified Data.Text.Lazy.Encoding         as T.L (decodeLatin1,
+                                                         encodeUtf8)
+
+import           Internal
+
+-- primitives
+
+decodeBs2Bs :: BS.ByteString -> Either String BS.ByteString
+decodeBs2Bs = B64.decodeUnpadded
+
+decodeBsL2BsL :: BS.L.ByteString -> Either String BS.L.ByteString
+decodeBsL2BsL = B64.L.decodeUnpadded
+
+encodeBs2Bs :: BS.ByteString -> BS.ByteString
+encodeBs2Bs = B64.encodeUnpadded
+
+encodeBsL2BsL :: BS.L.ByteString -> BS.L.ByteString
+encodeBsL2BsL = B64.L.encodeUnpadded
+
+----------------------------------------------------------------------------
+-- exposed API
+
+-- | Typeclass representing types for which a binary-to-text /unpadded/ @base64url@ encoding is defined
+--
+-- @since 0.2.0.0
+class Encode bin txt where
+  -- | Encode binary data using /unpadded/ @base64url@ text encoding
+  --
+  -- @since 0.2.0.0
+  encode :: bin -> txt
+
+-- | Typeclass representing types for which a text-to-binary /unpadded/ @base64url@ decoding is defined
+--
+-- @since 0.2.0.0
+class Decode txt bin where
+  -- | Decode binary data encoded textually as /unpadded/ @base64url@
+  --
+  -- @since 0.2.0.0
+  decode :: txt -> Either String bin
+
+----------------------------------------------------------------------------
+-- instance matrix
+
+---- lazy BS -> *
+
+-- PRIMITIVE
+instance Encode BS.L.ByteString BS.L.ByteString where
+  encode = encodeBsL2BsL
+
+instance Encode BS.L.ByteString BS.ByteString where
+  encode = bsToStrict . encode
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Encode BS.L.ByteString BB.Builder where
+  encode = BB.lazyByteString . encode
+#endif
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Encode BS.L.ByteString SBS.ShortByteString where
+  encode = SBS.toShort . encode
+#endif
+
+instance Encode BS.L.ByteString T.Text where
+  encode = T.decodeLatin1 . encode
+
+instance Encode BS.L.ByteString T.L.Text where
+  encode = T.L.decodeLatin1 . encode
+
+instance Encode BS.L.ByteString TB.Builder where
+  encode = TB.fromLazyText . encode
+
+---- strict BS  -> *
+
+-- PRIMITIVE
+instance Encode BS.ByteString BS.ByteString where
+  encode = encodeBs2Bs
+
+instance Encode BS.ByteString BS.L.ByteString where
+  encode = bsFromStrict . encode
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Encode BS.ByteString BB.Builder where
+  encode = BB.byteString . encode
+#endif
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Encode BS.ByteString SBS.ShortByteString where
+  encode = SBS.toShort . encode
+#endif
+
+instance Encode BS.ByteString T.Text where
+  encode = T.decodeLatin1 . encode
+
+instance Encode BS.ByteString T.L.Text where
+  encode = T.L.fromStrict . T.decodeLatin1 . encode
+
+instance Encode BS.ByteString TB.Builder where
+  encode = TB.fromText . encode
+
+---- short BS  -> *
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Encode SBS.ShortByteString SBS.ShortByteString where
+  encode = SBS.toShort . encode . SBS.fromShort
+
+instance Encode SBS.ShortByteString BS.ByteString where
+  encode = encode . SBS.fromShort
+
+instance Encode SBS.ShortByteString BS.L.ByteString where
+  encode = encode . SBS.fromShort
+
+instance Encode SBS.ShortByteString BB.Builder where
+  encode = encode . SBS.fromShort
+
+instance Encode SBS.ShortByteString T.Text where
+  encode = T.decodeLatin1 . encode
+
+instance Encode SBS.ShortByteString T.L.Text where
+  encode = T.L.fromStrict . T.decodeLatin1 . encode
+
+instance Encode SBS.ShortByteString TB.Builder where
+  encode = TB.fromText . encode
+#endif
+
+---- BB  -> *
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Encode BB.Builder SBS.ShortByteString where
+  encode = encode . BB.toLazyByteString
+#endif
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Encode BB.Builder BB.Builder where
+  encode = encode . BB.toLazyByteString
+
+instance Encode BB.Builder BS.ByteString where
+  encode = encode . BB.toLazyByteString
+
+instance Encode BB.Builder BS.L.ByteString where
+  encode = encode . BB.toLazyByteString
+
+instance Encode BB.Builder T.Text where
+  encode = T.decodeLatin1 . encode
+
+instance Encode BB.Builder T.L.Text where
+  encode = T.L.decodeLatin1 . encode
+
+instance Encode BB.Builder TB.Builder where
+  encode = TB.fromLazyText . encode
+#endif
+
+------------------------------------------------------------------------------
+
+-- PRIMITIVE
+instance Decode BS.ByteString BS.ByteString where
+  decode = decodeBs2Bs
+
+instance Decode BS.ByteString BS.L.ByteString where
+  decode = fmap bsFromStrict . decode
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Decode BS.ByteString SBS.ShortByteString where
+  decode = fmap SBS.toShort . decode
+#endif
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Decode BS.ByteString BB.Builder where
+  decode = fmap BB.byteString . decode
+#endif
+
+----
+
+-- PRIMITIVE
+instance Decode BS.L.ByteString BS.L.ByteString where
+  decode = decodeBsL2BsL
+
+instance Decode BS.L.ByteString BS.ByteString where
+  decode = fmap bsToStrict . decode
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Decode BS.L.ByteString SBS.ShortByteString where
+  decode = fmap SBS.toShort . decode
+#endif
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Decode BS.L.ByteString BB.Builder where
+  decode = fmap BB.byteString . decode
+#endif
+
+----
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Decode SBS.ShortByteString SBS.ShortByteString where
+  decode = fmap SBS.toShort . decode . SBS.fromShort
+
+instance Decode SBS.ShortByteString BS.ByteString where
+  decode = decode . SBS.fromShort
+
+instance Decode SBS.ShortByteString BS.L.ByteString where
+  decode = decode . SBS.fromShort
+
+instance Decode SBS.ShortByteString BB.Builder where
+  decode = decode . SBS.fromShort
+#endif
+
+----
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Decode BB.Builder SBS.ShortByteString where
+  decode = decode . BB.toLazyByteString
+#endif
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Decode BB.Builder BS.L.ByteString where
+  decode = decode . BB.toLazyByteString
+
+instance Decode BB.Builder BS.ByteString where
+  decode = decode . BB.toLazyByteString
+
+instance Decode BB.Builder BB.Builder where
+  decode = decode . BB.toLazyByteString
+#endif
+
+----
+
+instance Decode T.Text BS.ByteString where
+  decode = decode . T.encodeUtf8
+
+instance Decode T.Text BS.L.ByteString where
+  decode = decode . T.encodeUtf8
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Decode T.Text SBS.ShortByteString where
+  decode = decode . T.encodeUtf8
+#endif
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Decode T.Text BB.Builder where
+  decode = decode . T.encodeUtf8
+#endif
+
+----
+
+instance Decode T.L.Text BS.ByteString where
+  decode = decode . T.L.encodeUtf8
+
+instance Decode T.L.Text BS.L.ByteString where
+  decode = decode . T.L.encodeUtf8
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Decode T.L.Text SBS.ShortByteString where
+  decode = decode . T.L.encodeUtf8
+#endif
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Decode T.L.Text BB.Builder where
+  decode = decode . T.L.encodeUtf8
+#endif
+
+----
+
+instance Decode TB.Builder BS.ByteString where
+  decode = decode . TB.toLazyText
+
+instance Decode TB.Builder BS.L.ByteString where
+  decode = decode . TB.toLazyText
+
+#if MIN_VERSION_bytestring(0,10,4)
+instance Decode TB.Builder SBS.ShortByteString where
+  decode = decode . TB.toLazyText
+#endif
+
+#if MIN_VERSION_bytestring(0,10,0)
+instance Decode TB.Builder BB.Builder where
+  decode = decode . TB.toLazyText
+#endif
