diff --git a/girepository/giarginfo.c b/girepository/giarginfo.c
index c96976a..6672f7d 100644
--- a/girepository/giarginfo.c
+++ b/girepository/giarginfo.c
@@ -127,6 +127,9 @@ g_arg_info_is_caller_allocates (GIArgInfo *info)
  *
  * Obtain if the argument is optional.
  *
+ * This only returns meaningful results since 1.41.0 and is equal to
+ * g_arg_info_may_be_null().
+ *
  * Returns: %TRUE if it is an optional argument
  */
 gboolean
@@ -154,6 +157,22 @@ g_arg_info_is_optional (GIArgInfo *info)
 gboolean
 g_arg_info_may_be_null (GIArgInfo *info)
 {
+  return g_arg_info_is_optional(info);
+}
+
+/**
+ * g_arg_info_is_nullable:
+ * @info: a #GIArgInfo
+ *
+ * Obtain if the passed in or passed out value can be %NULL.
+ * For in arguments this is means the same as optional.
+ *
+ * Returns: %TRUE if the value can be %NULL
+ * Since: 1.41.0
+ */
+gboolean
+g_arg_info_is_nullable (GIArgInfo *info)
+{
   GIRealInfo *rinfo = (GIRealInfo *)info;
   ArgBlob *blob;
 
diff --git a/girepository/giarginfo.h b/girepository/giarginfo.h
index 4045ab9..89566bf 100644
--- a/girepository/giarginfo.h
+++ b/girepository/giarginfo.h
@@ -45,6 +45,7 @@ gboolean               g_arg_info_is_return_value        (GIArgInfo *info);
 gboolean               g_arg_info_is_optional            (GIArgInfo *info);
 gboolean               g_arg_info_is_caller_allocates    (GIArgInfo *info);
 gboolean               g_arg_info_may_be_null            (GIArgInfo *info);
+gboolean               g_arg_info_is_nullable            (GIArgInfo *info);
 gboolean               g_arg_info_is_skip                (GIArgInfo *info);
 GITransfer             g_arg_info_get_ownership_transfer (GIArgInfo *info);
 GIScopeType            g_arg_info_get_scope              (GIArgInfo *info);
diff --git a/girepository/girepository.symbols b/girepository/girepository.symbols
index 5f01adf..93850c7 100644
--- a/girepository/girepository.symbols
+++ b/girepository/girepository.symbols
@@ -5,6 +5,7 @@ g_arg_info_get_ownership_transfer
 g_arg_info_get_scope
 g_arg_info_get_type
 g_arg_info_is_caller_allocates
+g_arg_info_is_nullable
 g_arg_info_is_optional
 g_arg_info_is_return_value
 g_arg_info_is_skip
diff --git a/girepository/girparser.c b/girepository/girparser.c
index 6c76866..fb088b0 100644
--- a/girepository/girparser.c
+++ b/girepository/girparser.c
@@ -1137,8 +1137,10 @@ start_parameter (GMarkupParseContext *context,
     {
       if (param->out)
         param->optional = TRUE;
-      else
+      else {
         param->nullable = TRUE;
+        param->optional = TRUE;
+      }
     }
 
   if (skip && strcmp (skip, "1") == 0)
diff --git a/girepository/gitypelib-internal.h b/girepository/gitypelib-internal.h
index 93d621b..da42098 100644
--- a/girepository/gitypelib-internal.h
+++ b/girepository/gitypelib-internal.h
@@ -396,13 +396,13 @@ typedef union _SimpleTypeBlob SimpleTypeBlob;
  *   parameter, the function actually takes an uint32*.
  * @caller_allocates: The parameter is a pointer to a struct or object that
  *   will receive an output of the function.
+ * @optional: For an out parameter, indicates that NULL may be passed in
+ *   if the value is not needed.
  * @nullable: Only meaningful for types which are passed as pointers. For an
  *   in parameter, indicates if it is ok to pass NULL in. Gor an out
  *   parameter, indicates whether it may return NULL. Note that NULL is a
  *   valid GList and GSList value, thus allow_none will normally be set
  *   for parameters of these types.
- * @optional: For an out parameter, indicates that NULL may be passed in
- *   if the value is not needed.
  * @transfer_ownership: For an in parameter, indicates that the function takes
  *   over ownership of the parameter value. For an out parameter, it indicates
  *   that the caller is responsible for freeing the return value.
@@ -437,8 +437,8 @@ typedef struct {
   guint          in                           : 1;
   guint          out                          : 1;
   guint          caller_allocates             : 1;
-  guint          nullable                     : 1;
   guint          optional                     : 1;
+  guint          nullable                     : 1;
   guint          transfer_ownership           : 1;
   guint          transfer_container_ownership : 1;
   guint          return_value                 : 1;
