diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8484c44..532fd0e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,11 @@
 # Changelog
 
 
-## Unreleased
+## 4.6.0 (under development)
+
+* Fixed encoding issues when passing byte string parameters on Python 3
+  ([#84](https://github.com/laterpay/laterpay-client-python/issues/84))
+
 
 ## 4.5.0
 
diff --git a/laterpay/signing.py b/laterpay/signing.py
index 24b1bf2..347aa31 100644
--- a/laterpay/signing.py
+++ b/laterpay/signing.py
@@ -53,12 +53,8 @@ def sort_params(param_dict):
     for name, value_list in six.iteritems(param_dict):
         if isinstance(value_list, (list, tuple)):
             for value in value_list:
-                if not isinstance(value, six.string_types):
-                    value = str(value)
                 param_list.append((name, value))
         else:
-            if not isinstance(value_list, six.string_types):
-                value_list = str(value_list)
             param_list.append((name, value_list))
 
     return sorted(param_list)
@@ -127,10 +123,13 @@ def create_base_message(params, url, method='POST'):
 
         values_str = []
 
-        # If any non six.string_types objects, ``str()`` them.
         for value in values:
-            if not isinstance(value, six.string_types):
+            if not isinstance(value, (six.string_types, six.binary_type)):
+                # If any non-string or non-bytes like objects, ``str()`` them.
                 value = str(value)
+            if six.PY3 and isinstance(value, six.binary_type):
+                # Issue #84, decode byte strings before using them on Python 3
+                value = value.decode()
             values_str.append(value)
 
         data[key] = [quote(compat.encode_if_unicode(value_str), safe='') for value_str in values_str]

diff --git a/tests/test_signing.py b/tests/test_signing.py
index ecbff1f..2f0fe02 100644
--- a/tests/test_signing.py
+++ b/tests/test_signing.py
@@ -25,7 +25,7 @@ class TestSigningHelper(unittest.TestCase):
         )
 
     def test_create_message_bytestrings(self):
-        params = {'parĄm1': 'valuĘ'}
+        params = {b'par\xc4\x84m1': b'valu\xc4\x98'}
         url = 'https://endpoint.com/ąpi'
 
         msg = signing.create_base_message(params, url)

Decode byte strings before using them during signing
On Python 3, when singing a request containing a byte string (`b'foo'`) the value is casted into a string, resulting in `"b'foo'"`, instead of properly decoding the string to `'foo'`.

tests/test_signing.py::TestSigningHelper::test_create_message_bytestrings
tests/test_signing.py::TestSigningHelper::test_create_message_sorting_and_combining_params tests/test_signing.py::TestSigningHelper::test_create_message_unicode tests/test_signing.py::TestSigningHelper::test_create_message_wrong_method tests/test_signing.py::TestSigningHelper::test_normalise_param_structure tests/test_signing.py::TestSigningHelper::test_sign tests/test_signing.py::TestSigningHelper::test_sign_and_encode tests/test_signing.py::TestSigningHelper::test_signing_with_item tests/test_signing.py::TestSigningHelper::test_url_verification tests/test_signing.py::TestSigningHelper::test_verify_invalid_unicode_signature tests/test_signing.py::TestSigningHelper::test_verify_str_signature tests/test_signing.py::TestSigningHelper::test_verify_unicode_signature