diff --git a/gi/pygi-cache.c b/gi/pygi-cache.c
index 1279318..eeef4e4 100644
--- a/gi/pygi-cache.c
+++ b/gi/pygi-cache.c
@@ -95,7 +95,9 @@ pygi_arg_base_setup (PyGIArgCache *arg_cache,
                                                               &arg_cache->default_value);
         }
         arg_cache->arg_name = gi_base_info_get_name ((GIBaseInfo *) arg_info);
-        arg_cache->allow_none = gi_arg_info_may_be_null (arg_info);
+        arg_cache->allow_none = gi_arg_info_may_be_null (arg_info)
+                                || (direction & PYGI_DIRECTION_FROM_PYTHON
+                                    && gi_arg_info_is_optional (arg_info));
 
         if (arg_cache->type_tag == GI_TYPE_TAG_INTERFACE || arg_cache->type_tag == GI_TYPE_TAG_ARRAY)
             arg_cache->is_caller_allocates = gi_arg_info_is_caller_allocates (arg_info);
@@ -591,6 +593,8 @@ _callable_cache_generate_args_cache_real (PyGICallableCache *callable_cache,
 
         /* Ensure arguments always have a name when available */
         arg_cache->arg_name = gi_base_info_get_name ((GIBaseInfo *) arg_info);
+        arg_cache->allow_none = arg_cache->allow_none
+                                || gi_arg_info_may_be_null (arg_info);
 
         gi_base_info_unref ( (GIBaseInfo *)arg_info);
 
