diff --git a/Python/ast.c b/Python/ast.c
index d7e3b36..821a5ad 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -3050,10 +3050,6 @@
 static PyObject *
 decode_utf8(const char **sPtr, const char *end, char* encoding)
 {
-#ifndef Py_USING_UNICODE
-    Py_FatalError("decode_utf8 should not be called in this build.");
-    return NULL;
-#else
     PyObject *u, *v;
     char *s, *t;
     t = s = (char *)*sPtr;
@@ -3066,7 +3062,6 @@
     v = PyUnicode_AsEncodedString(u, encoding, NULL);
     Py_DECREF(u);
     return v;
-#endif
 }
 
 static PyObject *
@@ -3186,11 +3181,9 @@
             return NULL;
         }
     }
-#ifdef Py_USING_UNICODE
     if (!*bytesmode) {
         return decode_unicode(s, len, rawmode, encoding);
     }
-#endif
     if (*bytesmode) {
         /* Disallow non-ascii characters (but not escapes) */
         const char *c;
@@ -3207,19 +3200,12 @@
                      strcmp(encoding, "iso-8859-1") != 0);
     if (rawmode || strchr(s, '\\') == NULL) {
         if (need_encoding) {
-#ifndef Py_USING_UNICODE
-            /* This should not happen - we never see any other
-               encoding. */
-            Py_FatalError(
-                "cannot deal with encodings in this build.");
-#else
             PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
             if (u == NULL)
                 return NULL;
             v = PyUnicode_AsEncodedString(u, encoding, NULL);
             Py_DECREF(u);
             return v;
-#endif
         } else {
             return PyString_FromStringAndSize(s, len);
         }
@@ -3258,7 +3244,6 @@
                 if (v == NULL)
                     goto onError;
             }
-#ifdef Py_USING_UNICODE
             else {
                 PyObject *temp = PyUnicode_Concat(v, s);
                 Py_DECREF(s);
@@ -3267,7 +3252,6 @@
                 if (v == NULL)
                     goto onError;
             }
-#endif
         }
     }
     return v;
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index f58dd80..828cb5d 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -25,9 +25,7 @@
 
 /* Forward */
 static PyObject *filterstring(PyObject *, PyObject *);
-#ifdef Py_USING_UNICODE
 static PyObject *filterunicode(PyObject *, PyObject *);
-#endif
 static PyObject *filtertuple (PyObject *, PyObject *);
 
 static PyObject *
@@ -272,10 +270,8 @@
 	/* Strings and tuples return a result of the same type. */
 	if (PyString_Check(seq))
 		return filterstring(func, seq);
-#ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(seq))
 		return filterunicode(func, seq);
-#endif
 	if (PyTuple_Check(seq))
 		return filtertuple(func, seq);
 
@@ -381,7 +377,6 @@
 "or string, return the same type, else return a list.");
 
 
-#ifdef Py_USING_UNICODE
 static PyObject *
 builtin_unichr(PyObject *self, PyObject *args)
 {
@@ -397,7 +392,6 @@
 "chr(i) -> Unicode character\n\
 \n\
 Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.");
-#endif
 
 
 static PyObject *
@@ -440,7 +434,6 @@
 
 	cf.cf_flags = supplied_flags;
 
-#ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(cmd)) {
 		tmp = PyUnicode_AsUTF8String(cmd);
 		if (tmp == NULL)
@@ -448,7 +441,6 @@
 		cmd = tmp;
 		cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
 	}
-#endif
 	if (PyObject_AsReadBuffer(cmd, (const void **)&str, &length))
 		return NULL;
 	if ((size_t)length != strlen(str)) {
@@ -600,7 +592,6 @@
 	}
 	cf.cf_flags = 0;
 
-#ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(cmd)) {
 		tmp = PyUnicode_AsUTF8String(cmd);
 		if (tmp == NULL)
@@ -608,7 +599,6 @@
 		cmd = tmp;
 		cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
 	}
-#endif
 	if (PyString_AsStringAndSize(cmd, &str, NULL)) {
 		Py_XDECREF(tmp);
 		return NULL;
@@ -708,7 +698,6 @@
 		char *str;
 		PyCompilerFlags cf;
 		cf.cf_flags = 0;
-#ifdef Py_USING_UNICODE
 		if (PyUnicode_Check(prog)) {
 			tmp = PyUnicode_AsUTF8String(prog);
 			if (tmp == NULL)
@@ -716,7 +705,6 @@
 			prog = tmp;
 			cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
 		}
-#endif
 		if (PyString_AsStringAndSize(prog, &str, NULL))
 			return NULL;
 		if (PyEval_MergeCompilerFlags(&cf))
@@ -850,13 +838,11 @@
 
 	if (!PyArg_UnpackTuple(args, "getattr", 2, 3, &v, &name, &dflt))
 		return NULL;
-#ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(name)) {
 		name = _PyUnicode_AsDefaultEncodedString(name, NULL);
 		if (name == NULL)
 			return NULL;
 	}
-#endif
 
 	if (!PyString_Check(name)) {
 		PyErr_SetString(PyExc_TypeError,
@@ -906,13 +892,11 @@
 
 	if (!PyArg_UnpackTuple(args, "hasattr", 2, 2, &v, &name))
 		return NULL;
-#ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(name)) {
 		name = _PyUnicode_AsDefaultEncodedString(name, NULL);
 		if (name == NULL)
 			return NULL;
 	}
-#endif
 
 	if (!PyString_Check(name)) {
 		PyErr_SetString(PyExc_TypeError,
@@ -1471,7 +1455,6 @@
 			ord = (long)((unsigned char)*PyString_AS_STRING(obj));
 			return PyInt_FromLong(ord);
 		}
-#ifdef Py_USING_UNICODE
 	}
 	else if (PyUnicode_Check(obj)) {
 		size = PyUnicode_GET_SIZE(obj);
@@ -1479,7 +1462,6 @@
 			ord = (long)*PyUnicode_AS_UNICODE(obj);
 			return PyInt_FromLong(ord);
 		}
-#endif
 	} 
 	else if (PyBytes_Check(obj)) {
 		/* XXX Hopefully this is temporary */
@@ -2356,9 +2338,7 @@
 	SETBUILTIN("tuple",		&PyTuple_Type);
 	SETBUILTIN("type",		&PyType_Type);
 	SETBUILTIN("xrange",		&PyRange_Type);
-#ifdef Py_USING_UNICODE
 	SETBUILTIN("unicode",		&PyUnicode_Type);
-#endif
 	debug = PyBool_FromLong(Py_OptimizeFlag == 0);
 	if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
 		Py_XDECREF(debug);
@@ -2536,7 +2516,6 @@
 	return NULL;
 }
 
-#ifdef Py_USING_UNICODE
 /* Helper for filter(): filter a Unicode object through a function */
 
 static PyObject *
@@ -2630,4 +2609,3 @@
 	Py_DECREF(result);
 	return NULL;
 }
-#endif
diff --git a/Python/codecs.c b/Python/codecs.c
index 4b0f4cb..ddd1935 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -468,7 +468,6 @@
 }
 
 
-#ifdef Py_USING_UNICODE
 PyObject *PyCodec_IgnoreErrors(PyObject *exc)
 {
     Py_ssize_t end;
@@ -729,7 +728,6 @@
 	return NULL;
     }
 }
-#endif
 
 static PyObject *strict_errors(PyObject *self, PyObject *exc)
 {
@@ -737,7 +735,6 @@
 }
 
 
-#ifdef Py_USING_UNICODE
 static PyObject *ignore_errors(PyObject *self, PyObject *exc)
 {
     return PyCodec_IgnoreErrors(exc);
@@ -760,7 +757,6 @@
 {
     return PyCodec_BackslashReplaceErrors(exc);
 }
-#endif
 
 static int _PyCodecRegistry_Init(void)
 {
@@ -777,7 +773,6 @@
 		METH_O
 	    }
 	},
-#ifdef Py_USING_UNICODE
 	{
 	    "ignore",
 	    {
@@ -810,7 +805,6 @@
 		METH_O
 	    }
 	}
-#endif
     };
 
     PyInterpreterState *interp = PyThreadState_GET()->interp;
diff --git a/Python/getargs.c b/Python/getargs.c
index 3b58c98..2a02a89 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -547,9 +547,7 @@
 
 	const char *format = *p_format;
 	char c = *format++;
-#ifdef Py_USING_UNICODE
 	PyObject *uarg;
-#endif
 	
 	switch (c) {
 	
@@ -780,7 +778,6 @@
 				*p = PyString_AS_STRING(arg);
 				STORE_SIZE(PyString_GET_SIZE(arg));
 			}
-#ifdef Py_USING_UNICODE
 			else if (PyUnicode_Check(arg)) {
 				uarg = UNICODE_DEFAULT_ENCODING(arg);
 				if (uarg == NULL)
@@ -789,7 +786,6 @@
 				*p = PyString_AS_STRING(uarg);
 				STORE_SIZE(PyString_GET_SIZE(uarg));
 			}
-#endif
 			else { /* any buffer-like object */
 				char *buf;
 				Py_ssize_t count = convertbuffer(arg, p, &buf);
@@ -803,7 +799,6 @@
 			
 			if (PyString_Check(arg))
 				*p = PyString_AS_STRING(arg);
-#ifdef Py_USING_UNICODE
 			else if (PyUnicode_Check(arg)) {
 				uarg = UNICODE_DEFAULT_ENCODING(arg);
 				if (uarg == NULL)
@@ -811,7 +806,6 @@
 							  arg, msgbuf, bufsize);
 				*p = PyString_AS_STRING(uarg);
 			}
-#endif
 			else
 				return converterr("string", arg, msgbuf, bufsize);
 			if ((Py_ssize_t)strlen(*p) != PyString_Size(arg))
@@ -834,7 +828,6 @@
 				*p = PyString_AS_STRING(arg);
 				STORE_SIZE(PyString_GET_SIZE(arg));
 			}
-#ifdef Py_USING_UNICODE
 			else if (PyUnicode_Check(arg)) {
 				uarg = UNICODE_DEFAULT_ENCODING(arg);
 				if (uarg == NULL)
@@ -843,7 +836,6 @@
 				*p = PyString_AS_STRING(uarg);
 				STORE_SIZE(PyString_GET_SIZE(uarg));
 			}
-#endif
 			else { /* any buffer-like object */
 				char *buf;
 				Py_ssize_t count = convertbuffer(arg, p, &buf);
@@ -859,7 +851,6 @@
 				*p = 0;
 			else if (PyString_Check(arg))
 				*p = PyString_AS_STRING(arg);
-#ifdef Py_USING_UNICODE
 			else if (PyUnicode_Check(arg)) {
 				uarg = UNICODE_DEFAULT_ENCODING(arg);
 				if (uarg == NULL)
@@ -867,7 +858,6 @@
 							  arg, msgbuf, bufsize);
 				*p = PyString_AS_STRING(uarg);
 			}
-#endif
 			else
 				return converterr("string or None", 
 						  arg, msgbuf, bufsize);
@@ -897,10 +887,8 @@
 
 		/* Get 'e' parameter: the encoding name */
 		encoding = (const char *)va_arg(*p_va, const char *);
-#ifdef Py_USING_UNICODE
 		if (encoding == NULL)
 			encoding = PyUnicode_GetDefaultEncoding();
-#endif
 			
 		/* Get output buffer parameter:
 		   's' (recode all objects via Unicode) or
@@ -926,7 +914,6 @@
 			Py_INCREF(s);
 		}
 		else {
-#ifdef Py_USING_UNICODE
 		    	PyObject *u;
 
 			/* Convert object to Unicode */
@@ -950,9 +937,6 @@
 					"(encoder failed to return a string)",
 					arg, msgbuf, bufsize);
 			}
-#else
-			return converterr("string<e>", arg, msgbuf, bufsize);
-#endif
 		}
 		size = PyString_GET_SIZE(s);
 
@@ -1054,7 +1038,6 @@
 		break;
 	}
 
-#ifdef Py_USING_UNICODE
 	case 'u': {/* raw unicode buffer (Py_UNICODE *) */
 		if (*format == '#') { /* any buffer-like object */
 			void **p = (void **)va_arg(*p_va, char **);
@@ -1077,7 +1060,6 @@
 		}
 		break;
 	}
-#endif
 
 	case 'S': { /* string object */
 		PyObject **p = va_arg(*p_va, PyObject **);
@@ -1088,7 +1070,6 @@
 		break;
 	}
 	
-#ifdef Py_USING_UNICODE
 	case 'U': { /* Unicode object */
 		PyObject **p = va_arg(*p_va, PyObject **);
 		if (PyUnicode_Check(arg))
@@ -1097,7 +1078,6 @@
 			return converterr("unicode", arg, msgbuf, bufsize);
 		break;
 	}
-#endif
 	
 	case 'O': { /* object */
 		PyTypeObject *type;
@@ -1611,9 +1591,7 @@
 	
 	case 's': /* string */
 	case 'z': /* string or None */
-#ifdef Py_USING_UNICODE
 	case 'u': /* unicode string */
-#endif
 	case 't': /* buffer, read-only */
 	case 'w': /* buffer, read-write */
 		{
@@ -1631,9 +1609,7 @@
 	/* object codes */
 
 	case 'S': /* string object */
-#ifdef Py_USING_UNICODE
 	case 'U': /* unicode string object */
-#endif
 		{
 			(void) va_arg(*p_va, PyObject **);
 			break;
diff --git a/Python/import.c b/Python/import.c
index 6d742b9..7e3d2f4 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1256,7 +1256,6 @@
 		PyObject *v = PyList_GetItem(path, i);
 		if (!v)
 			return NULL;
-#ifdef Py_USING_UNICODE
 		if (PyUnicode_Check(v)) {
 			copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
 				PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
@@ -1265,7 +1264,6 @@
 			v = copy;
 		}
 		else
-#endif
 		if (!PyString_Check(v))
 			continue;
 		len = PyString_GET_SIZE(v);
diff --git a/Python/marshal.c b/Python/marshal.c
index 2fb47e7..94d73a0 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -254,7 +254,6 @@
 		w_long((long)n, p);
 		w_string(PyString_AS_STRING(v), (int)n, p);
 	}
-#ifdef Py_USING_UNICODE
 	else if (PyUnicode_Check(v)) {
 	        PyObject *utf8;
 		utf8 = PyUnicode_AsUTF8String(v);
@@ -274,7 +273,6 @@
 		w_string(PyString_AS_STRING(utf8), (int)n, p);
 		Py_DECREF(utf8);
 	}
-#endif
 	else if (PyTuple_Check(v)) {
 		w_byte(TYPE_TUPLE, p);
 		n = PyTuple_Size(v);
@@ -678,7 +676,6 @@
 		Py_INCREF(v);
 		return v;
 
-#ifdef Py_USING_UNICODE
 	case TYPE_UNICODE:
 	    {
 		char *buffer;
@@ -701,7 +698,6 @@
 		PyMem_DEL(buffer);
 		return v;
 	    }
-#endif
 
 	case TYPE_TUPLE:
 		n = r_long(p);
diff --git a/Python/modsupport.c b/Python/modsupport.c
index 1aa3df2..af774f0 100644
--- a/Python/modsupport.c
+++ b/Python/modsupport.c
@@ -240,7 +240,6 @@
 	return v;
 }
 
-#ifdef Py_USING_UNICODE
 static int
 _ustrlen(Py_UNICODE *u)
 {
@@ -249,7 +248,6 @@
 	while (*v != 0) { i++; v++; } 
 	return i;
 }
-#endif
 
 static PyObject *
 do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags)
@@ -349,7 +347,6 @@
 		case 'K':
 			return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG));
 #endif
-#ifdef Py_USING_UNICODE
 		case 'u':
 		{
 			PyObject *v;
@@ -375,7 +372,6 @@
 			}
 			return v;
 		}
-#endif
 		case 'f':
 		case 'd':
 			return PyFloat_FromDouble(
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 3d16ba5..c2005f1 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -152,7 +152,7 @@
 	PyThreadState *tstate;
 	PyObject *bimod, *sysmod;
 	char *p;
-#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
+#if defined(HAVE_LANGINFO_H) && defined(CODESET)
 	char *codeset;
 	char *saved_locale;
 	PyObject *sys_stream, *sys_isatty;
@@ -199,10 +199,8 @@
 	if (interp->modules_reloading == NULL)
 		Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");
 
-#ifdef Py_USING_UNICODE
 	/* Init Unicode implementation; relies on the codec registry */
 	_PyUnicode_Init();
-#endif
 
 	bimod = _PyBuiltin_Init();
 	if (bimod == NULL)
@@ -250,7 +248,7 @@
 	if (!warnings_module)
 		PyErr_Clear();
 
-#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
+#if defined(HAVE_LANGINFO_H) && defined(CODESET)
 	/* On Unix, set the file system encoding according to the
 	   user's preference, if the CODESET names a well-known
 	   Python codec, and Py_FileSystemDefaultEncoding isn't
@@ -468,10 +466,8 @@
 	PyLong_Fini();
 	PyFloat_Fini();
 
-#ifdef Py_USING_UNICODE
 	/* Cleanup Unicode implementation */
 	_PyUnicode_Fini();
-#endif
 
 	/* XXX Still allocated:
 	   - various static ad-hoc pointers to interned strings
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 0d4a4e3..247ec05 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -210,7 +210,6 @@
 exit status will be one (i.e., failure)."
 );
 
-#ifdef Py_USING_UNICODE
 
 static PyObject *
 sys_getdefaultencoding(PyObject *self)
@@ -259,7 +258,6 @@
 operating system filenames."
 );
 
-#endif
 
 
 static PyObject *
@@ -763,10 +761,8 @@
 	{"exc_clear",	sys_exc_clear, METH_NOARGS, exc_clear_doc},
 	{"excepthook",	sys_excepthook, METH_VARARGS, excepthook_doc},
 	{"exit",	sys_exit, METH_VARARGS, exit_doc},
-#ifdef Py_USING_UNICODE
 	{"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
 	 METH_NOARGS, getdefaultencoding_doc},
-#endif
 #ifdef HAVE_DLOPEN
 	{"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
 	 getdlopenflags_doc},
@@ -777,10 +773,8 @@
 #ifdef DYNAMIC_EXECUTION_PROFILE
 	{"getdxp",	_Py_GetDXProfile, METH_VARARGS},
 #endif
-#ifdef Py_USING_UNICODE
 	{"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
 	 METH_NOARGS, getfilesystemencoding_doc},
-#endif
 #ifdef Py_TRACE_REFS
 	{"getobjects",	_Py_GetObjects, METH_VARARGS},
 #endif
@@ -799,10 +793,8 @@
 #ifdef USE_MALLOPT
 	{"mdebug",	sys_mdebug, METH_VARARGS},
 #endif
-#ifdef Py_USING_UNICODE
 	{"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
 	 setdefaultencoding_doc},
-#endif
 	{"setcheckinterval",	sys_setcheckinterval, METH_VARARGS,
 	 setcheckinterval_doc},
 	{"getcheckinterval",	sys_getcheckinterval, METH_NOARGS,
@@ -1184,10 +1176,8 @@
 		   	    PyString_FromString(Py_GetExecPrefix()));
 	SET_SYS_FROM_STRING("maxint",
 			    PyInt_FromLong(PyInt_GetMax()));
-#ifdef Py_USING_UNICODE
 	SET_SYS_FROM_STRING("maxunicode",
 			    PyInt_FromLong(PyUnicode_GetMax()));
-#endif
 	SET_SYS_FROM_STRING("builtin_module_names",
 			    list_builtin_module_names());
 	{
