diff --git a/src/blob.c b/src/blob.c
index 90070ba..17b3ced 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -133,7 +133,7 @@ PyDoc_STRVAR(Blob_size__doc__, "Size.");
 PyObject *
 Blob_size__get__(Blob *self)
 {
-    return PyLong_FromLongLong(git_blob_rawsize(self->blob));
+    return PyInt_FromLongLong(git_blob_rawsize(self->blob));
 }
 
 
diff --git a/src/commit.c b/src/commit.c
index 1ca9792..7d06c75 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -80,7 +80,7 @@ PyDoc_STRVAR(Commit_commit_time__doc__, "Commit time.");
 PyObject *
 Commit_commit_time__get__(Commit *commit)
 {
-    return PyLong_FromLongLong(git_commit_time(commit->commit));
+    return PyInt_FromLongLong(git_commit_time(commit->commit));
 }
 
 
@@ -89,7 +89,7 @@ PyDoc_STRVAR(Commit_commit_time_offset__doc__, "Commit time offset.");
 PyObject *
 Commit_commit_time_offset__get__(Commit *commit)
 {
-    return PyLong_FromLong(git_commit_time_offset(commit->commit));
+    return PyInt_FromLong(git_commit_time_offset(commit->commit));
 }
 
 
diff --git a/src/diff.c b/src/diff.c
index 4d17b86..810c6d2 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -587,7 +587,7 @@ PyDoc_STRVAR(DiffStats_insertions__doc__, "Total number of insertions");
 PyObject *
 DiffStats_insertions__get__(DiffStats *self)
 {
-    return PyLong_FromSize_t(git_diff_stats_insertions(self->stats));
+    return PyInt_FromSize_t(git_diff_stats_insertions(self->stats));
 }
 
 PyDoc_STRVAR(DiffStats_deletions__doc__, "Total number of deletions");
@@ -595,7 +595,7 @@ PyDoc_STRVAR(DiffStats_deletions__doc__, "Total number of deletions");
 PyObject *
 DiffStats_deletions__get__(DiffStats *self)
 {
-    return PyLong_FromSize_t(git_diff_stats_deletions(self->stats));
+    return PyInt_FromSize_t(git_diff_stats_deletions(self->stats));
 }
 
 PyDoc_STRVAR(DiffStats_files_changed__doc__, "Total number of files changed");
@@ -603,7 +603,7 @@ PyDoc_STRVAR(DiffStats_files_changed__doc__, "Total number of files changed");
 PyObject *
 DiffStats_files_changed__get__(DiffStats *self)
 {
-    return PyLong_FromSize_t(git_diff_stats_files_changed(self->stats));
+    return PyInt_FromSize_t(git_diff_stats_files_changed(self->stats));
 }
 
 PyDoc_STRVAR(DiffStats_format__doc__,
@@ -805,10 +805,10 @@ Diff_getitem(Diff *self, PyObject *value)
 {
     size_t i;
 
-    if (!PyLong_Check(value))
-        return NULL;
+    if (!PyInt_Check(value))
+        return NULL; /* FIXME Raise error */
 
-    i = PyLong_AsUnsignedLong(value);
+    i = PyInt_AsSize_t(value);
     return diff_get_patch_byindex(self->diff, i);
 }
 
diff --git a/src/object.c b/src/object.c
index 372ed3d..0a55782 100644
--- a/src/object.c
+++ b/src/object.c
@@ -97,7 +97,7 @@ PyDoc_STRVAR(Object_type__doc__,
 PyObject *
 Object_type__get__(Object *self)
 {
-    return PyLong_FromLong(git_object_type(self->obj));
+    return PyInt_FromLong(git_object_type(self->obj));
 }
 
 PyDoc_STRVAR(Object__pointer__doc__, "Get the object's pointer. For internal use only.");
@@ -143,14 +143,15 @@ PyDoc_STRVAR(Object_peel__doc__,
 PyObject *
 Object_peel(Object *self, PyObject *py_type)
 {
-    int type = -1, err;
+    int err;
+    git_otype otype;
     git_object *peeled;
 
-    type = py_object_to_object_type(py_type);
-    if (type == -1)
+    otype = py_object_to_otype(py_type);
+    if (otype == GIT_OBJ_BAD)
         return NULL;
 
-    err = git_object_peel(&peeled, self->obj, (git_otype)type);
+    err = git_object_peel(&peeled, self->obj, otype);
     if (err < 0)
         return Error_set(err);
 
diff --git a/src/options.c b/src/options.c
index cf25ef7..92571b2 100644
--- a/src/options.c
+++ b/src/options.c
@@ -65,11 +65,11 @@ option(PyObject *self, PyObject *args)
     if (!py_option)
         return NULL;
 
-    if (!PyLong_Check(py_option))
+    if (!PyInt_Check(py_option))
         return Error_type_error(
             "option should be an integer, got %.200s", py_option);
 
-    option = PyLong_AsLong(py_option);
+    option = PyInt_AsLong(py_option);
 
     switch (option) {
         case GIT_OPT_GET_SEARCH_PATH:
@@ -80,11 +80,11 @@ option(PyObject *self, PyObject *args)
             if (!py_level)
                 return NULL;
 
-            if (!PyLong_Check(py_level))
+            if (!PyInt_Check(py_level))
                 return Error_type_error(
                     "level should be an integer, got %.200s", py_level);
 
-            return get_search_path(PyLong_AsLong(py_level));
+            return get_search_path(PyInt_AsLong(py_level));
         }
 
         case GIT_OPT_SET_SEARCH_PATH:
@@ -101,7 +101,7 @@ option(PyObject *self, PyObject *args)
             if (!py_path)
                 return NULL;
 
-            if (!PyLong_Check(py_level))
+            if (!PyInt_Check(py_level))
                 return Error_type_error(
                     "level should be an integer, got %.200s", py_level);
 
@@ -110,7 +110,7 @@ option(PyObject *self, PyObject *args)
                 return NULL;
 
             err = git_libgit2_opts(
-                GIT_OPT_SET_SEARCH_PATH, PyLong_AsLong(py_level), path);
+                GIT_OPT_SET_SEARCH_PATH, PyInt_AsLong(py_level), path);
             Py_DECREF(tpath);
 
             if (err < 0)
@@ -127,7 +127,7 @@ option(PyObject *self, PyObject *args)
             if (error < 0)
                 return Error_set(error);
 
-            return PyLong_FromSize_t(size);
+            return PyInt_FromSize_t(size);
         }
 
         case GIT_OPT_SET_MWINDOW_SIZE:
@@ -139,11 +139,11 @@ option(PyObject *self, PyObject *args)
             if (!py_size)
                 return NULL;
 
-            if (!PyLong_Check(py_size))
+            if (!PyInt_Check(py_size))
                 return Error_type_error(
                     "size should be an integer, got %.200s", py_size);
 
-            size = PyLong_AsSize_t(py_size);
+            size = PyInt_AsSize_t(py_size);
             error = git_libgit2_opts(GIT_OPT_SET_MWINDOW_SIZE, size);
             if (error  < 0)
                 return Error_set(error);
@@ -159,7 +159,7 @@ option(PyObject *self, PyObject *args)
             if (error < 0)
                 return Error_set(error);
 
-            return PyLong_FromSize_t(limit);
+            return PyInt_FromSize_t(limit);
         }
 
         case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
@@ -171,11 +171,11 @@ option(PyObject *self, PyObject *args)
             if (!py_limit)
                 return NULL;
 
-            if (!PyLong_Check(py_limit))
+            if (!PyInt_Check(py_limit))
                 return Error_type_error(
                     "limit should be an integer, got %.200s", py_limit);
 
-            limit = PyLong_AsSize_t(py_limit);
+            limit = PyInt_AsSize_t(py_limit);
             error = git_libgit2_opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, limit);
             if (error < 0)
                 return Error_set(error);
@@ -197,12 +197,12 @@ option(PyObject *self, PyObject *args)
             if (!py_limit)
                 return NULL;
 
-            if (!PyLong_Check(py_limit))
+            if (!PyInt_Check(py_limit))
                 return Error_type_error(
                     "limit should be an integer, got %.200s", py_limit);
 
-            object_type = PyLong_AsLong(py_object_type);
-            limit = PyLong_AsSize_t(py_limit);
+            object_type = PyInt_AsLong(py_object_type);
+            limit = PyInt_AsSize_t(py_limit);
             error = git_libgit2_opts(
                 GIT_OPT_SET_CACHE_OBJECT_LIMIT, object_type, limit);
 
@@ -221,11 +221,11 @@ option(PyObject *self, PyObject *args)
             if (!py_max_size)
                 return NULL;
 
-            if (!PyLong_Check(py_max_size))
+            if (!PyInt_Check(py_max_size))
                 return Error_type_error(
                     "max_size should be an integer, got %.200s", py_max_size);
 
-            max_size = PyLong_AsSize_t(py_max_size);
+            max_size = PyInt_AsSize_t(py_max_size);
             error = git_libgit2_opts(GIT_OPT_SET_CACHE_MAX_SIZE, max_size);
             if (error < 0)
                 return Error_set(error);
@@ -240,11 +240,11 @@ option(PyObject *self, PyObject *args)
 
             py_flag = PyTuple_GetItem(args, 1);
 
-            if (!PyLong_Check(py_flag))
+            if (!PyInt_Check(py_flag))
                 return Error_type_error(
                     "flag should be an integer, got %.200s", py_flag);
 
-            flag = PyLong_AsSize_t(py_flag);
+            flag = PyInt_AsSize_t(py_flag);
             error = git_libgit2_opts(GIT_OPT_ENABLE_CACHING, flag);
             if (error < 0)
                 return Error_set(error);
@@ -262,8 +262,8 @@ option(PyObject *self, PyObject *args)
             if (error < 0)
                 return Error_set(error);
 
-            PyTuple_SetItem(tup, 0, PyLong_FromLong(current));
-            PyTuple_SetItem(tup, 1, PyLong_FromLong(allowed));
+            PyTuple_SetItem(tup, 0, PyInt_FromLong(current));
+            PyTuple_SetItem(tup, 1, PyInt_FromLong(allowed));
 
             return tup;
         }
diff --git a/src/reference.c b/src/reference.c
index 4cdf757..395b241 100644
--- a/src/reference.c
+++ b/src/reference.c
@@ -325,7 +325,7 @@ Reference_type__get__(Reference *self)
 
     CHECK_REFERENCE(self);
     c_type = git_reference_type(self->reference);
-    return PyLong_FromLong(c_type);
+    return PyInt_FromLong(c_type);
 }
 
 
@@ -379,7 +379,8 @@ PyDoc_STRVAR(Reference_peel__doc__,
 PyObject *
 Reference_peel(Reference *self, PyObject *args)
 {
-    int err, type;
+    int err;
+    git_otype otype;
     git_object *obj;
     PyObject *py_type = Py_None;
 
@@ -388,11 +389,11 @@ Reference_peel(Reference *self, PyObject *args)
     if (!PyArg_ParseTuple(args, "|O", &py_type))
         return NULL;
 
-    type = py_object_to_object_type(py_type);
-    if (type == -1)
+    otype = py_object_to_otype(py_type);
+    if (otype == GIT_OBJ_BAD)
         return NULL;
 
-    err = git_reference_peel(&obj, self->reference, type);
+    err = git_reference_peel(&obj, self->reference, otype);
     if (err < 0)
         return Error_set(err);
 
diff --git a/src/repository.c b/src/repository.c
index 383a2ad..23c0fa4 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -1564,7 +1564,7 @@ Repository_status(Repository *self)
             path = entry->head_to_index->old_file.path;
         else
             path = entry->index_to_workdir->old_file.path;
-        status = PyLong_FromLong((long) entry->status);
+        status = PyInt_FromLong((long) entry->status);
 
         err = PyDict_SetItemString(dict, path, status);
         Py_CLEAR(status);
@@ -1606,7 +1606,7 @@ Repository_status_file(Repository *self, PyObject *value)
         free(path);
         return err_obj;
     }
-    return PyLong_FromLong(status);
+    return PyInt_FromLong(status);
 }
 
 
diff --git a/src/signature.c b/src/signature.c
index 536a9fc..aea1f2d 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -158,7 +158,7 @@ PyDoc_STRVAR(Signature_time__doc__, "Unix time.");
 PyObject *
 Signature_time__get__(Signature *self)
 {
-    return PyLong_FromLongLong(self->signature->when.time);
+    return PyInt_FromLongLong(self->signature->when.time);
 }
 
 
@@ -167,7 +167,7 @@ PyDoc_STRVAR(Signature_offset__doc__, "Offset from UTC in minutes.");
 PyObject *
 Signature_offset__get__(Signature *self)
 {
-    return PyLong_FromLong(self->signature->when.offset);
+    return PyInt_FromLong(self->signature->when.offset);
 }
 
 PyGetSetDef Signature_getseters[] = {
diff --git a/src/tree.c b/src/tree.c
index c5a0bac..56222af 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -54,7 +54,7 @@ PyDoc_STRVAR(TreeEntry_filemode__doc__, "Filemode.");
 PyObject *
 TreeEntry_filemode__get__(TreeEntry *self)
 {
-    return PyLong_FromLong(git_tree_entry_filemode(self->entry));
+    return PyInt_FromLong(git_tree_entry_filemode(self->entry));
 }
 
 
@@ -290,7 +290,7 @@ Tree_fix_index(Tree *self, PyObject *py_index)
     size_t len;
     long slen;
 
-    index = PyLong_AsLong(py_index);
+    index = PyInt_AsLong(py_index);
     if (PyErr_Occurred())
         return -1;
 
@@ -359,7 +359,7 @@ Tree_getitem(Tree *self, PyObject *value)
     int err;
 
     /* Case 1: integer */
-    if (PyLong_Check(value))
+    if (PyInt_Check(value))
         return Tree_getitem_by_index(self, value);
 
     /* Case 2: byte or text string */
diff --git a/src/utils.c b/src/utils.c
index 2cf6aaa..ac56404 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -160,40 +160,39 @@ on_error:
 static git_otype
 py_type_to_git_type(PyTypeObject *py_type)
 {
-    git_otype type = GIT_OBJ_BAD;
+    if (py_type == &CommitType)
+        return GIT_OBJ_COMMIT;
+    else if (py_type == &TreeType)
+        return GIT_OBJ_TREE;
+    else if (py_type == &BlobType)
+        return GIT_OBJ_BLOB;
+    else if (py_type == &TagType)
+        return GIT_OBJ_TAG;
 
-    if (py_type == &CommitType) {
-        type = GIT_OBJ_COMMIT;
-    } else if (py_type == &TreeType) {
-        type = GIT_OBJ_TREE;
-    } else if (py_type == &BlobType) {
-        type = GIT_OBJ_BLOB;
-    } else if (py_type == &TagType) {
-        type = GIT_OBJ_TAG;
-    }
-
-    return type;
+    PyErr_SetString(PyExc_ValueError, "invalid target type");
+    return GIT_OBJ_BAD; /* -1 */
 }
 
-int
-py_object_to_object_type(PyObject *py_type)
+git_otype
+py_object_to_otype(PyObject *py_type)
 {
-    int type = -1;
+    long value;
 
     if (py_type == Py_None)
         return GIT_OBJ_ANY;
 
-    if (PyLong_Check(py_type)) {
-        type = PyLong_AsLong(py_type);
-        if (type == -1 && PyErr_Occurred())
-            return -1;
-    } else if (PyType_Check(py_type)) {
-        type = py_type_to_git_type((PyTypeObject *) py_type);
+    if (PyInt_Check(py_type)) {
+        value = PyInt_AsLong(py_type);
+        if (value == -1 && PyErr_Occurred())
+            return GIT_OBJ_BAD;
+
+        /* TODO Check whether the value is a valid value */
+        return (git_otype)value;
     }
 
-    if (type == -1) {
-        PyErr_SetString(PyExc_ValueError, "invalid target type");
-    }
+    if (PyType_Check(py_type))
+        return py_type_to_git_type((PyTypeObject *) py_type);
 
-    return type;
+    PyErr_SetString(PyExc_ValueError, "invalid target type");
+    return GIT_OBJ_BAD; /* -1 */
 }
diff --git a/src/utils.h b/src/utils.h
index 25a598b..18e29d1 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -40,13 +40,17 @@
 #endif
 
 /* Python 2 support */
+#ifndef Py_hash_t
+  #define Py_hash_t long
+#endif
+
+#ifndef PyLong_AsSize_t
+  #define PyLong_AsSize_t (size_t)PyLong_AsUnsignedLong
+#endif
+
 #if PY_MAJOR_VERSION == 2
-  #define PyLong_FromSize_t PyInt_FromSize_t
-  #define PyLong_AsSize_t (size_t)PyInt_AsSsize_t
-  #define PyLong_AsLong PyInt_AsLong
-  #undef PyLong_Check
-  #define PyLong_Check PyInt_Check
-  #define PyLong_FromLong PyInt_FromLong
+  #define PyInt_AsSize_t (size_t)PyInt_AsLong
+  #define PyInt_FromLongLong PyInt_FromLong
   #define PyBytes_AS_STRING PyString_AS_STRING
   #define PyBytes_AsString PyString_AsString
   #define PyBytes_AsStringAndSize PyString_AsStringAndSize
@@ -57,19 +61,18 @@
   #define to_path(x) to_bytes(x)
   #define to_encoding(x) to_bytes(x)
 #else
+  #define PyInt_Check PyLong_Check
+  #define PyInt_FromSize_t PyLong_FromSize_t
+  #define PyInt_FromLong PyLong_FromLong
+  #define PyInt_FromLongLong PyLong_FromLongLong
+  #define PyInt_AsLong PyLong_AsLong
+  #define PyInt_AsSize_t PyLong_AsSize_t
+
   #define to_path(x) to_unicode(x, Py_FileSystemDefaultEncoding, "strict")
   #define to_encoding(x) PyUnicode_DecodeASCII(x, strlen(x), "strict")
   #define PyString_FromFormat(s, ...) PyUnicode_FromFormat(s, __VA_ARGS__)
 #endif
 
-#ifdef PYPY_VERSION
-  #define PyLong_AsSize_t (size_t)PyLong_AsUnsignedLong
-#endif
-
-#ifndef Py_hash_t
-  #define Py_hash_t long
-#endif
-
 
 #define CHECK_REFERENCE(self)\
     if (self->reference == NULL) {\
@@ -118,7 +121,7 @@ const char *py_str_borrow_c_str(PyObject **tvaue, PyObject *value, const char *e
 PyObject * get_pylist_from_git_strarray(git_strarray *strarray);
 int get_strarraygit_from_pylist(git_strarray *array, PyObject *pylist);
 
-int py_object_to_object_type(PyObject *py_type);
+int py_object_to_otype(PyObject *py_type);
 
 #define py_path_to_c_str(py_path) \
         py_str_to_c_str(py_path, Py_FileSystemDefaultEncoding)
diff --git a/src/walker.c b/src/walker.c
index 325b72f..ebdb86d 100644
--- a/src/walker.c
+++ b/src/walker.c
@@ -98,13 +98,13 @@ PyDoc_STRVAR(Walker_sort__doc__,
 PyObject *
 Walker_sort(Walker *self, PyObject *py_sort_mode)
 {
-    int sort_mode;
+    long sort_mode;
 
-    sort_mode = (int)PyLong_AsLong(py_sort_mode);
+    sort_mode = PyInt_AsLong(py_sort_mode);
     if (sort_mode == -1 && PyErr_Occurred())
         return NULL;
 
-    git_revwalk_sorting(self->walk, sort_mode);
+    git_revwalk_sorting(self->walk, (unsigned int)sort_mode);
 
     Py_RETURN_NONE;
 }