diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c
index ded5b12..a44ec38 100644
--- a/gi/pygi-argument.c
+++ b/gi/pygi-argument.c
@@ -208,8 +208,14 @@ _pygi_g_type_info_check_object (GITypeInfo *type_info,
         case GI_TYPE_TAG_BOOLEAN:
             /* No check; every Python object has a truth value. */
             break;
-        case GI_TYPE_TAG_INT8:
         case GI_TYPE_TAG_UINT8:
+        {
+            if (PyString_Check (object) && PyString_Size (object) == 1) {
+                retval = 1;
+                break;
+            }
+        }
+        case GI_TYPE_TAG_INT8:
         case GI_TYPE_TAG_INT16:
         case GI_TYPE_TAG_UINT16:
         case GI_TYPE_TAG_INT32:
@@ -655,8 +661,15 @@ _pygi_argument_from_object (PyObject   *object,
             arg.v_boolean = PyObject_IsTrue (object);
             break;
         }
-        case GI_TYPE_TAG_INT8:
         case GI_TYPE_TAG_UINT8:
+        {
+            if (PyString_Check (object) && PyString_Size (object) == 1) {
+                char *str = PyString_AsString (object);
+                arg.v_long = str[0];
+                break;
+            }
+        }
+        case GI_TYPE_TAG_INT8:
         case GI_TYPE_TAG_INT16:
         case GI_TYPE_TAG_UINT16:
         case GI_TYPE_TAG_INT32:
