diff --git a/Objects/abstract.c b/Objects/abstract.c
index 80a1289..503a611 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -720,8 +720,10 @@
 	static PyObject * str__format__ = NULL;
 	PyObject *empty = NULL;
 	PyObject *result = NULL;
+#ifdef Py_USING_UNICODE
 	int spec_is_unicode;
 	int result_is_unicode;
+#endif
 
 	/* Initialize cached value */
 	if (str__format__ == NULL) {
@@ -738,11 +740,15 @@
 	}
 
 	/* Check the format_spec type, and make sure it's str or unicode */
+#if Py_USING_UNICODE
 	if (PyUnicode_Check(format_spec))
 		spec_is_unicode = 1;
 	else if (PyString_Check(format_spec))
 		spec_is_unicode = 0;
 	else {
+#else
+        if (!PyString_Check(format_spec)) {
+#endif
 		PyErr_Format(PyExc_TypeError,
 			     "format expects arg 2 to be string "
 			     "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
@@ -773,9 +779,11 @@
 			   depending on the type of the format
 			   specifier).  For new-style classes, this
 			   logic is done by object.__format__(). */
+#ifdef Py_USING_UNICODE
 			if (spec_is_unicode)
 				self_as_str = PyObject_Unicode(obj);
 			else
+#endif
 				self_as_str = PyObject_Str(obj);
 			if (self_as_str == NULL)
 				goto done;
@@ -818,11 +826,15 @@
 		goto done;
 
 	/* Check the result type, and make sure it's str or unicode */
+#ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(result))
 		result_is_unicode = 1;
 	else if (PyString_Check(result))
 		result_is_unicode = 0;
 	else {
+#else
+	if (!PyString_Check(result)) {
+#endif
 		PyErr_Format(PyExc_TypeError,
 			     "%.100s.__format__ must return string or "
 			     "unicode, not %.100s", Py_TYPE(obj)->tp_name,
@@ -834,12 +846,14 @@
 
 	/* Convert to unicode, if needed.  Required if spec is unicode
 	   and result is str */
+#ifdef Py_USING_UNICODE
 	if (spec_is_unicode && !result_is_unicode) {
 		PyObject *tmp = PyObject_Unicode(result);
 		/* This logic works whether or not tmp is NULL */
 		Py_DECREF(result);
 		result = tmp;
 	}
+#endif
 
 done:
 	Py_XDECREF(empty);
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 97b0502..4b8d585 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -803,6 +803,7 @@
         return 0;
     }
 
+#ifdef Py_USING_UNICODE
     if (PyUnicode_Check(arg)) {
         /* Encode via the codec registry */
         PyObject *encoded, *new;
@@ -822,6 +823,7 @@
         Py_DECREF(new);
         return 0;
     }
+#endif
 
     /* If it's not unicode, there can't be encoding or errors */
     if (encoding != NULL || errors != NULL) {
@@ -929,14 +931,14 @@
             "bytearray object is too large to make repr");
         return NULL;
     }
-    v = PyUnicode_FromUnicode(NULL, newsize);
+    v = PyString_FromStringAndSize(NULL, newsize);
     if (v == NULL) {
         return NULL;
     }
     else {
         register Py_ssize_t i;
-        register Py_UNICODE c;
-        register Py_UNICODE *p;
+        register char c;
+        register char *p;
         int quote;
 
         /* Figure out which quote to use; single is preferred */
@@ -956,7 +958,7 @@
             ;
         }
 
-        p = PyUnicode_AS_UNICODE(v);
+        p = PyString_AS_STRING(v);
         while (*quote_prefix)
             *p++ = *quote_prefix++;
         *p++ = quote;
@@ -964,7 +966,7 @@
         for (i = 0; i < length; i++) {
             /* There's at least enough room for a hex escape
                and a closing quote. */
-            assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 5);
+            assert(newsize - (p - PyString_AS_STRING(v)) >= 5);
             c = self->ob_bytes[i];
             if (c == '\'' || c == '\\')
                 *p++ = '\\', *p++ = c;
@@ -985,13 +987,13 @@
             else
                 *p++ = c;
         }
-        assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 1);
+        assert(newsize - (p - PyString_AS_STRING(v)) >= 1);
         *p++ = quote;
         while (*quote_postfix) {
            *p++ = *quote_postfix++;
         }
         *p = '\0';
-        if (PyUnicode_Resize(&v, (p - PyUnicode_AS_UNICODE(v)))) {
+        if (_PyString_Resize(&v, (p - PyString_AS_STRING(v)))) {
             Py_DECREF(v);
             return NULL;
         }
@@ -1025,6 +1027,7 @@
     /* Bytes can be compared to anything that supports the (binary)
        buffer API.  Except that a comparison with Unicode is always an
        error, even if the comparison is for equality. */
+#ifdef Py_USING_UNICODE
     if (PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type) ||
         PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type)) {
         if (Py_BytesWarningFlag && op == Py_EQ) {
@@ -1036,6 +1039,7 @@
         Py_INCREF(Py_NotImplemented);
         return Py_NotImplemented;
     }
+#endif
 
     self_size = _getbuffer(self, &self_bytes);
     if (self_size < 0) {
@@ -2939,8 +2943,14 @@
 
     if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors))
         return NULL;
-    if (encoding == NULL)
+    if (encoding == NULL) {
+#ifdef Py_USING_UNICODE
         encoding = PyUnicode_GetDefaultEncoding();
+#else
+        PyErr_SetString(PyExc_ValueError, "no encoding specified");
+        return NULL;
+#endif
+    }
     return PyCodec_Decode(self, encoding, errors);
 }
 
@@ -3038,10 +3048,8 @@
 Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef').");
 
 static int
-hex_digit_to_int(Py_UNICODE c)
+hex_digit_to_int(char c)
 {
-    if (c >= 128)
-        return -1;
     if (ISDIGIT(c))
         return c - '0';
     else {
@@ -3056,17 +3064,14 @@
 static PyObject *
 bytes_fromhex(PyObject *cls, PyObject *args)
 {
-    PyObject *newbytes, *hexobj;
+    PyObject *newbytes;
     char *buf;
-    Py_UNICODE *hex;
+    char *hex;
     Py_ssize_t hexlen, byteslen, i, j;
     int top, bot;
 
-    if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj))
+    if (!PyArg_ParseTuple(args, "s#:fromhex", &hex, &hexlen))
         return NULL;
-    assert(PyUnicode_Check(hexobj));
-    hexlen = PyUnicode_GET_SIZE(hexobj);
-    hex = PyUnicode_AS_UNICODE(hexobj);
     byteslen = hexlen/2; /* This overestimates if there are spaces */
     newbytes = PyByteArray_FromStringAndSize(NULL, byteslen);
     if (!newbytes)
@@ -3104,10 +3109,18 @@
 {
     PyObject *latin1, *dict;
     if (self->ob_bytes)
+#ifdef Py_USING_UNICODE
         latin1 = PyUnicode_DecodeLatin1(self->ob_bytes,
                                         Py_SIZE(self), NULL);
+#else
+        latin1 = PyString_FromStringAndSize(self->ob_bytes, Py_SIZE(self))
+#endif
     else
+#ifdef Py_USING_UNICODE
         latin1 = PyUnicode_FromString("");
+#else
+        latin1 = PyString_FromString("");
+#endif
 
     dict = PyObject_GetAttrString((PyObject *)self, "__dict__");
     if (dict == NULL) {
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 5e9073d..1df37d1 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3418,9 +3418,13 @@
 
         if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
                 return NULL;
+#ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(format_spec)) {
 	        self_as_str = PyObject_Unicode(self);
 	} else if (PyString_Check(format_spec)) {
+#else
+        if (PyString_Check(format_spec)) {
+#endif
 	        self_as_str = PyObject_Str(self);
 	} else {
 	        PyErr_SetString(PyExc_TypeError, "argument to __format__ must be unicode or str");
