diff --git a/bin/system-info.c b/bin/system-info.c
index e8fab9c45ceeddc025ce474c5eb35db58aee97c0..37ad0dcb2131c0f78c17c9004e9fd364709034e5 100644
--- a/bin/system-info.c
+++ b/bin/system-info.c
@@ -125,6 +125,8 @@
 
 #include <json-glib/json-glib.h>
 
+#include <steam-runtime-tools/utils-internal.h>
+
 enum
 {
   OPTION_HELP = 1,
@@ -212,153 +214,92 @@ divert_stdout_to_stderr (GError **error)
 }
 
 static void
-jsonify_library_issues (JsonBuilder *builder,
-                        SrtLibraryIssues issues)
+jsonify_flags (JsonBuilder *builder,
+               GType flags_type,
+               unsigned int values)
 {
-  if ((issues & SRT_LIBRARY_ISSUES_CANNOT_LOAD) != 0)
-    json_builder_add_string_value (builder, "cannot-load");
+  GFlagsClass *class;
+  GFlagsValue *flags_value;
+
+  g_return_if_fail (G_TYPE_IS_FLAGS (flags_type));
+
+  class = g_type_class_ref (flags_type);
+
+  while (values != 0)
+    {
+      flags_value = g_flags_get_first_value (class, values);
 
-  if ((issues & SRT_LIBRARY_ISSUES_MISSING_SYMBOLS) != 0)
-    json_builder_add_string_value (builder, "missing-symbols");
+      if (flags_value == NULL)
+        break;
 
-  if ((issues & SRT_LIBRARY_ISSUES_MISVERSIONED_SYMBOLS) != 0)
-    json_builder_add_string_value (builder, "misversioned-symbols");
+      json_builder_add_string_value (builder, flags_value->value_nick);
+      values &= ~flags_value->value;
+    }
+
+  if (values)
+    {
+      gchar *rest = g_strdup_printf ("0x%x", values);
+
+      json_builder_add_string_value (builder, rest);
+
+      g_free (rest);
+    }
 
-  if ((issues & SRT_LIBRARY_ISSUES_INTERNAL_ERROR) != 0)
-    json_builder_add_string_value (builder, "internal-error");
+  g_type_class_unref (class);
+}
 
-  if ((issues & SRT_LIBRARY_ISSUES_UNKNOWN_EXPECTATIONS) != 0)
-    json_builder_add_string_value (builder, "unknown-expectations");
+static void
+jsonify_library_issues (JsonBuilder *builder,
+                        SrtLibraryIssues issues)
+{
+  jsonify_flags (builder, SRT_TYPE_LIBRARY_ISSUES, issues);
 }
 
 static void
 jsonify_graphics_issues (JsonBuilder *builder,
                          SrtGraphicsIssues issues)
 {
-  if ((issues & SRT_GRAPHICS_ISSUES_CANNOT_LOAD) != 0)
-    json_builder_add_string_value (builder, "cannot-load");
-
-  if ((issues & SRT_GRAPHICS_ISSUES_INTERNAL_ERROR) != 0)
-    json_builder_add_string_value (builder, "internal-error");
-
-  if ((issues & SRT_GRAPHICS_ISSUES_SOFTWARE_RENDERING) != 0)
-    json_builder_add_string_value (builder, "software-rendering");
-
-  if ((issues & SRT_GRAPHICS_ISSUES_TIMEOUT) != 0)
-    json_builder_add_string_value (builder, "timeout");
-
-  if ((issues & SRT_GRAPHICS_ISSUES_CANNOT_DRAW) != 0)
-    json_builder_add_string_value (builder, "cannot-draw");
+  jsonify_flags (builder, SRT_TYPE_GRAPHICS_ISSUES, issues);
 }
 
 static void
 jsonify_graphics_library_vendor (JsonBuilder *builder,
                                  SrtGraphicsLibraryVendor vendor)
 {
-  if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN)
-    json_builder_add_string_value (builder, "unknown");
-
-  else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_GLVND)
-    json_builder_add_string_value (builder, "glvnd");
-
-  else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN_NON_GLVND)
-    json_builder_add_string_value (builder, "unknown-non-glvnd");
-
-  else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_MESA)
-    json_builder_add_string_value (builder, "mesa");
-
-  else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_NVIDIA)
-    json_builder_add_string_value (builder, "nvidia");
+  const char *s = srt_enum_value_to_nick (SRT_TYPE_GRAPHICS_LIBRARY_VENDOR, vendor);
 
+  if (s != NULL)
+    {
+      json_builder_add_string_value (builder, s);
+    }
   else
-    json_builder_add_string_value (builder, "unexpected-vendor");
+    {
+      gchar *fallback = g_strdup_printf ("(unknown value %d)", vendor);
+
+      json_builder_add_string_value (builder, fallback);
+      g_free (fallback);
+    }
 }
 
 static void
 jsonify_steam_issues (JsonBuilder *builder,
                       SrtSteamIssues issues)
 {
-  if ((issues & SRT_STEAM_ISSUES_INTERNAL_ERROR) != 0)
-    json_builder_add_string_value (builder, "internal-error");
-
-  if ((issues & SRT_STEAM_ISSUES_CANNOT_FIND) != 0)
-    json_builder_add_string_value (builder, "cannot-find");
-
-  if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_STEAM_NOT_SYMLINK) != 0)
-    json_builder_add_string_value (builder, "dot-steam-steam-not-symlink");
-
-  if ((issues & SRT_STEAM_ISSUES_CANNOT_FIND_DATA) != 0)
-    json_builder_add_string_value (builder, "cannot-find-data");
-
-  if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_STEAM_NOT_DIRECTORY) != 0)
-    json_builder_add_string_value (builder, "dot-steam-steam-not-directory");
-
-  if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_ROOT_NOT_SYMLINK) != 0)
-    json_builder_add_string_value (builder, "dot-steam-root-not-symlink");
-
-  if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_ROOT_NOT_DIRECTORY) != 0)
-    json_builder_add_string_value (builder, "dot-steam-root-not-directory");
+  jsonify_flags (builder, SRT_TYPE_STEAM_ISSUES, issues);
 }
 
 static void
 jsonify_runtime_issues (JsonBuilder *builder,
                         SrtRuntimeIssues issues)
 {
-  if ((issues & SRT_RUNTIME_ISSUES_INTERNAL_ERROR) != 0)
-    json_builder_add_string_value (builder, "internal-error");
-
-  if ((issues & SRT_RUNTIME_ISSUES_DISABLED) != 0)
-    json_builder_add_string_value (builder, "disabled");
-
-  if ((issues & SRT_RUNTIME_ISSUES_NOT_RUNTIME) != 0)
-    json_builder_add_string_value (builder, "not-runtime");
-
-  if ((issues & SRT_RUNTIME_ISSUES_UNOFFICIAL) != 0)
-    json_builder_add_string_value (builder, "unofficial");
-
-  if ((issues & SRT_RUNTIME_ISSUES_UNEXPECTED_LOCATION) != 0)
-    json_builder_add_string_value (builder, "unexpected-location");
-
-  if ((issues & SRT_RUNTIME_ISSUES_UNEXPECTED_VERSION) != 0)
-    json_builder_add_string_value (builder, "unexpected-version");
-
-  if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_LD_PATH) != 0)
-    json_builder_add_string_value (builder, "not-in-ld-path");
-
-  if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_PATH) != 0)
-    json_builder_add_string_value (builder, "not-in-path");
-
-  if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_ENVIRONMENT) != 0)
-    json_builder_add_string_value (builder, "not-in-environment");
-
-  if ((issues & SRT_RUNTIME_ISSUES_NOT_USING_NEWER_HOST_LIBRARIES) != 0)
-    json_builder_add_string_value (builder, "not-using-newer-host-libraries");
+  jsonify_flags (builder, SRT_TYPE_RUNTIME_ISSUES, issues);
 }
 
 static void
 jsonify_locale_issues (JsonBuilder *builder,
                        SrtLocaleIssues issues)
 {
-  if ((issues & SRT_LOCALE_ISSUES_INTERNAL_ERROR) != 0)
-    json_builder_add_string_value (builder, "internal-error");
-
-  if ((issues & SRT_LOCALE_ISSUES_DEFAULT_MISSING) != 0)
-    json_builder_add_string_value (builder, "default-missing");
-
-  if ((issues & SRT_LOCALE_ISSUES_DEFAULT_NOT_UTF8) != 0)
-    json_builder_add_string_value (builder, "default-not-utf8");
-
-  if ((issues & SRT_LOCALE_ISSUES_C_UTF8_MISSING) != 0)
-    json_builder_add_string_value (builder, "c-utf8-missing");
-
-  if ((issues & SRT_LOCALE_ISSUES_EN_US_UTF8_MISSING) != 0)
-    json_builder_add_string_value (builder, "en-us-utf8-missing");
-
-  if ((issues & SRT_LOCALE_ISSUES_I18N_SUPPORTED_MISSING) != 0)
-    json_builder_add_string_value (builder, "i18n-supported-missing");
-
-  if ((issues & SRT_LOCALE_ISSUES_I18N_LOCALES_EN_US_MISSING) != 0)
-    json_builder_add_string_value (builder, "i18n-locales-en-us-missing");
+  jsonify_flags (builder, SRT_TYPE_LOCALE_ISSUES, issues);
 }
 
 static void
diff --git a/steam-runtime-tools/graphics-internal.h b/steam-runtime-tools/graphics-internal.h
index 88148a202af7576c1f86f29cbe0986cf8ef61a35..196c2d435f2d942856d1b072a8b7c5c88b2b7406 100644
--- a/steam-runtime-tools/graphics-internal.h
+++ b/steam-runtime-tools/graphics-internal.h
@@ -27,6 +27,7 @@
 #pragma once
 
 #include "steam-runtime-tools/steam-runtime-tools.h"
+#include "steam-runtime-tools/utils-internal.h"
 
 /*
  * _srt_graphics_new:
@@ -117,24 +118,25 @@ static inline int _srt_graphics_hash_key(SrtWindowSystem window_system,
 static inline const gchar *
 _srt_graphics_window_system_string (SrtWindowSystem window_system)
 {
-  if (window_system == SRT_WINDOW_SYSTEM_X11)
-    return "x11";
-  else if (window_system == SRT_WINDOW_SYSTEM_GLX)
-    return "glx";
-  else if (window_system == SRT_WINDOW_SYSTEM_EGL_X11)
+  const gchar *result = srt_enum_value_to_nick (SRT_TYPE_WINDOW_SYSTEM, window_system);
+
+  if (window_system == SRT_WINDOW_SYSTEM_EGL_X11)
     return "egl_x11";
+
+  if (result != NULL)
+    return result;
+
   return "unknown window system";
 }
 
 static inline const gchar *
 _srt_graphics_rendering_interface_string (SrtRenderingInterface rendering_interface)
 {
-  if (rendering_interface == SRT_RENDERING_INTERFACE_GL)
-    return "gl";
-  else if (rendering_interface == SRT_RENDERING_INTERFACE_GLESV2)
-    return "glesv2";
-  else if (rendering_interface == SRT_RENDERING_INTERFACE_VULKAN)
-    return "vulkan";
+  const gchar *result = srt_enum_value_to_nick (SRT_TYPE_RENDERING_INTERFACE, rendering_interface);
+
+  if (result != NULL)
+    return result;
+
   return "unknown rendering interface";
 }
 
diff --git a/steam-runtime-tools/utils-internal.h b/steam-runtime-tools/utils-internal.h
index 396a76acb7679b63099a41758a4e94ea7afed8bc..5b93333fb553749a8d7cdebf1d0ee87550898278 100644
--- a/steam-runtime-tools/utils-internal.h
+++ b/steam-runtime-tools/utils-internal.h
@@ -48,3 +48,7 @@ G_GNUC_INTERNAL const char *_srt_find_myself (const char **helpers_path_out,
 G_GNUC_INTERNAL gboolean _srt_process_timeout_wait_status (int wait_status,
                                                            int *exit_status,
                                                            int *terminating_signal);
+
+const char *srt_enum_value_to_nick (GType enum_type,
+                                    int value);
+
diff --git a/steam-runtime-tools/utils.c b/steam-runtime-tools/utils.c
index d324b5db26576b4c61ce57d29f7e7eafe63484cd..0440ceb709bc53063fb348be7f18ce51adab48ff 100644
--- a/steam-runtime-tools/utils.c
+++ b/steam-runtime-tools/utils.c
@@ -409,6 +409,40 @@ _srt_filter_gameoverlayrenderer (const gchar *input)
   return ret;
 }
 
+/**
+ * srt_enum_value_to_nick
+ * @enum_type: The type of the enumeration.
+ * @value: The enumeration value to stringify.
+ *
+ * Get the #GEnumValue.value-nick of a given enumeration value.
+ * For example, `srt_enum_value_to_nick (SRT_TYPE_WINDOW_SYSTEM, SRT_WINDOW_SYSTEM_EGL_X11)`
+ * returns `"egl-x11"`.
+ *
+ * Returns: (transfer none): A string representation
+ *  of the given enumeration value.
+ */
+const char *
+srt_enum_value_to_nick (GType enum_type,
+                        int value)
+{
+  GEnumClass *class;
+  GEnumValue *enum_value;
+  const char *result;
+
+  g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
+
+  class = g_type_class_ref (enum_type);
+  enum_value = g_enum_get_value (class, value);
+
+  if (enum_value != NULL)
+    result = enum_value->value_nick;
+  else
+    result = NULL;
+
+  g_type_class_unref (class);
+  return result;
+}
+
 #if !GLIB_CHECK_VERSION(2, 36, 0)
 static void _srt_constructor (void) __attribute__((__constructor__));
 static void