diff --git a/src/conn/conn_api.c b/src/conn/conn_api.c
index 2e55aedcd..01f0f5cd3 100644
--- a/src/conn/conn_api.c
+++ b/src/conn/conn_api.c
@@ -2011,20 +2011,29 @@ __wt_verbose_config(WT_SESSION_IMPL *session, const char *cfg[])
     WT_CONNECTION_IMPL *conn;
     WT_DECL_RET;
     const WT_NAME_FLAG *ft;
-    uint64_t flags;
+    uint8_t verbose_lvl;
 
     conn = S2C(session);
 
     WT_RET(__wt_config_gets(session, cfg, "verbose", &cval));
 
-    flags = 0;
     for (ft = verbtypes; ft->name != NULL; ft++) {
-        if ((ret = __wt_config_subgets(session, &cval, ft->name, &sval)) == 0 && sval.val != 0)
-            LF_SET(ft->flag);
+        if ((ret = __wt_config_subgets(session, &cval, ft->name, &sval)) == 0 &&
+          sval.val >= WT_VERBOSE_LOG && sval.val <= WT_VERBOSE_DEBUG(5)) {
+            /*
+             * If no value is associated with the verbose (i.e passing verbose=[checkpoint]),
+             * default the event to WT_VERBOSE_DEBUG(1). All legacy uses of '__wt_verbose', being
+             * messages without an explict verbosity level, default to 'WT_VERBOSE_DEBUG(1)'.
+             */
+            verbose_lvl = sval.len == 0 ? WT_VERBOSE_DEBUG(1) : sval.val;
+            conn->verbose[ft->flag] = verbose_lvl;
+        } else if (ret == WT_NOTFOUND)
+            conn->verbose[ft->flag] = WT_VERBOSE_LOG;
+        else if (sval.val < WT_VERBOSE_LOG || sval.val > WT_VERBOSE_DEBUG(5))
+            ret = EINVAL;
         WT_RET_NOTFOUND_OK(ret);
     }
 
-    conn->verbose = flags;
     return (0);
 }
 
diff --git a/src/history/hs_rec.c b/src/history/hs_rec.c
index 2da95291c..67a9d93f5 100644
--- a/src/history/hs_rec.c
+++ b/src/history/hs_rec.c
@@ -25,10 +25,16 @@ __hs_verbose_cache_stats(WT_SESSION_IMPL *session, WT_BTREE *btree)
     double pct_dirty, pct_full;
     uint64_t ckpt_gen_current, ckpt_gen_last;
     uint32_t btree_id;
+    uint32_t hs_verb_event;
 
     btree_id = btree->id;
+    hs_verb_event = 0;
+    if (WT_VERBOSE_ISSET(session, WT_VERB_HS))
+        hs_verb_event = WT_VERB_HS;
+    else if (WT_VERBOSE_ISSET(session, WT_VERB_HS_ACTIVITY))
+        hs_verb_event = WT_VERB_HS_ACTIVITY;
 
-    if (!WT_VERBOSE_ISSET(session, WT_VERB_HS | WT_VERB_HS_ACTIVITY))
+    if (!hs_verb_event)
         return;
 
     conn = S2C(session);
@@ -46,7 +52,7 @@ __hs_verbose_cache_stats(WT_SESSION_IMPL *session, WT_BTREE *btree)
         WT_IGNORE_RET_BOOL(__wt_eviction_clean_needed(session, &pct_full));
         WT_IGNORE_RET_BOOL(__wt_eviction_dirty_needed(session, &pct_dirty));
 
-        __wt_verbose(session, WT_VERB_HS | WT_VERB_HS_ACTIVITY,
+        __wt_verbose(session, hs_verb_event,
           "Page reconciliation triggered history store write: file ID %" PRIu32
           ". Current history store file size: %" PRId64
           ", cache dirty: %2.3f%% , cache use: %2.3f%%",
diff --git a/src/include/connection.h b/src/include/connection.h
index 5b8f7e9f8..97654829e 100644
--- a/src/include/connection.h
+++ b/src/include/connection.h
@@ -210,6 +210,75 @@ struct __wt_name_flag {
         (conn)->hot_backup_list = NULL;                      \
     } while (0)
 
+/*
+ * Permitted verbose event categories that can be used when
+ * defining a verbose message.
+ */
+typedef enum {
+    WT_VERB_API = 0,
+    WT_VERB_BACKUP,
+    WT_VERB_BLOCK,
+    WT_VERB_CHECKPOINT,
+    WT_VERB_CHECKPOINT_CLEANUP,
+    WT_VERB_CHECKPOINT_PROGRESS,
+    WT_VERB_COMPACT,
+    WT_VERB_COMPACT_PROGRESS,
+    WT_VERB_ERROR_RETURNS,
+    WT_VERB_EVICT,
+    WT_VERB_EVICTSERVER,
+    WT_VERB_EVICT_STUCK,
+    WT_VERB_FILEOPS,
+    WT_VERB_HANDLEOPS,
+    WT_VERB_HS,
+    WT_VERB_HS_ACTIVITY,
+    WT_VERB_LOG,
+    WT_VERB_LSM,
+    WT_VERB_LSM_MANAGER,
+    WT_VERB_METADATA,
+    WT_VERB_MUTEX,
+    WT_VERB_OVERFLOW,
+    WT_VERB_READ,
+    WT_VERB_RECONCILE,
+    WT_VERB_RECOVERY,
+    WT_VERB_RECOVERY_PROGRESS,
+    WT_VERB_RTS,
+    WT_VERB_SALVAGE,
+    WT_VERB_SHARED_CACHE,
+    WT_VERB_SPLIT,
+    WT_VERB_TEMPORARY,
+    WT_VERB_THREAD_GROUP,
+    WT_VERB_TIERED,
+    WT_VERB_TIMESTAMP,
+    WT_VERB_TRANSACTION,
+    WT_VERB_VERIFY,
+    WT_VERB_VERSION,
+    WT_VERB_WRITE,
+    /* This entry needs to be the last in order to track the number of event items. */
+    WT_VERB_NUM_EVENTS,
+} WT_VERBOSE_EVENT;
+
+#define WT_VERBOSE_DEBUG(lvl) WT_VERBOSE_DEBUG_##lvl
+
+/*
+ * Permitted verbosity levels; to be used when defining verbose messages.
+ * The levels define a range of severity categories, with WT_VERBOSE_SEVERE being
+ * the lowest, most critical level (used by messages on critical failure paths)
+ * and WT_VERBOSE_DEBUG(5) being the highest verbosity/informational level
+ * (mostly adopted for debugging).
+ */
+typedef enum {
+    WT_VERBOSE_SEVERE = -4,
+    WT_VERBOSE_ERROR,
+    WT_VERBOSE_WARNING,
+    WT_VERBOSE_INFO,
+    WT_VERBOSE_LOG,
+    WT_VERBOSE_DEBUG(1),
+    WT_VERBOSE_DEBUG(2),
+    WT_VERBOSE_DEBUG(3),
+    WT_VERBOSE_DEBUG(4),
+    WT_VERBOSE_DEBUG(5)
+} WT_VERBOSE_LEVEL;
+
 /*
  * WT_CONNECTION_IMPL --
  *	Implementation of WT_CONNECTION
@@ -550,47 +619,7 @@ struct __wt_connection_impl {
     /* AUTOMATIC FLAG VALUE GENERATION STOP 64 */
     uint64_t debug_flags;
 
-/* AUTOMATIC FLAG VALUE GENERATION START 0 */
-#define WT_VERB_API 0x0000000001u
-#define WT_VERB_BACKUP 0x0000000002u
-#define WT_VERB_BLOCK 0x0000000004u
-#define WT_VERB_CHECKPOINT 0x0000000008u
-#define WT_VERB_CHECKPOINT_CLEANUP 0x0000000010u
-#define WT_VERB_CHECKPOINT_PROGRESS 0x0000000020u
-#define WT_VERB_COMPACT 0x0000000040u
-#define WT_VERB_COMPACT_PROGRESS 0x0000000080u
-#define WT_VERB_ERROR_RETURNS 0x0000000100u
-#define WT_VERB_EVICT 0x0000000200u
-#define WT_VERB_EVICTSERVER 0x0000000400u
-#define WT_VERB_EVICT_STUCK 0x0000000800u
-#define WT_VERB_FILEOPS 0x0000001000u
-#define WT_VERB_HANDLEOPS 0x0000002000u
-#define WT_VERB_HS 0x0000004000u
-#define WT_VERB_HS_ACTIVITY 0x0000008000u
-#define WT_VERB_LOG 0x0000010000u
-#define WT_VERB_LSM 0x0000020000u
-#define WT_VERB_LSM_MANAGER 0x0000040000u
-#define WT_VERB_METADATA 0x0000080000u
-#define WT_VERB_MUTEX 0x0000100000u
-#define WT_VERB_OVERFLOW 0x0000200000u
-#define WT_VERB_READ 0x0000400000u
-#define WT_VERB_RECONCILE 0x0000800000u
-#define WT_VERB_RECOVERY 0x0001000000u
-#define WT_VERB_RECOVERY_PROGRESS 0x0002000000u
-#define WT_VERB_RTS 0x0004000000u
-#define WT_VERB_SALVAGE 0x0008000000u
-#define WT_VERB_SHARED_CACHE 0x0010000000u
-#define WT_VERB_SPLIT 0x0020000000u
-#define WT_VERB_TEMPORARY 0x0040000000u
-#define WT_VERB_THREAD_GROUP 0x0080000000u
-#define WT_VERB_TIERED 0x0100000000u
-#define WT_VERB_TIMESTAMP 0x0200000000u
-#define WT_VERB_TRANSACTION 0x0400000000u
-#define WT_VERB_VERIFY 0x0800000000u
-#define WT_VERB_VERSION 0x1000000000u
-#define WT_VERB_WRITE 0x2000000000u
-    /* AUTOMATIC FLAG VALUE GENERATION STOP 64 */
-    uint64_t verbose;
+    uint8_t verbose[WT_VERB_NUM_EVENTS]; /* Verbose settings for our various events. */
 
 /*
  * Variable with flags for which subsystems the diagnostic stress timing delays have been requested.
diff --git a/src/include/error.h b/src/include/error.h
index ef3019405..1e37f2919 100644
--- a/src/include/error.h
+++ b/src/include/error.h
@@ -170,7 +170,7 @@
 #endif
 
 /* Verbose messages. */
-#define WT_VERBOSE_ISSET(session, flag) (FLD_ISSET(S2C(session)->verbose, flag))
+#define WT_VERBOSE_ISSET(session, flag) (WT_VERBOSE_DEBUG(1) <= S2C(session)->verbose[flag])
 
 /*
  * __wt_verbose --
diff --git a/src/txn/txn_recover.c b/src/txn/txn_recover.c
index c76e2af35..427bbdd93 100644
--- a/src/txn/txn_recover.c
+++ b/src/txn/txn_recover.c
@@ -8,6 +8,11 @@
 
 #include "wt_internal.h"
 
+/* Verbose message under both recovery events, being recovery & recovery_progress. */
+#define WT_VERB_RECOVERY_ALL(session)                                                  \
+    WT_VERBOSE_ISSET(session, WT_VERB_RECOVERY_PROGRESS) ? WT_VERB_RECOVERY_PROGRESS : \
+                                                           WT_VERB_RECOVERY
+
 /* State maintained during recovery. */
 typedef struct {
     const char *uri; /* File URI. */
@@ -413,8 +418,7 @@ __recovery_set_checkpoint_timestamp(WT_RECOVERY *r)
      */
     conn->txn_global.meta_ckpt_timestamp = conn->txn_global.recovery_timestamp = ckpt_timestamp;
 
-    __wt_verbose(session, WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS,
-      "Set global recovery timestamp: %s",
+    __wt_verbose(session, WT_VERB_RECOVERY_ALL(session), "Set global recovery timestamp: %s",
       __wt_timestamp_to_string(conn->txn_global.recovery_timestamp, ts_string));
 
     return (0);
@@ -445,8 +449,7 @@ __recovery_set_oldest_timestamp(WT_RECOVERY *r)
     conn->txn_global.oldest_timestamp = oldest_timestamp;
     conn->txn_global.has_oldest_timestamp = oldest_timestamp != WT_TS_NONE;
 
-    __wt_verbose(session, WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS,
-      "Set global oldest timestamp: %s",
+    __wt_verbose(session, WT_VERB_RECOVERY_ALL(session), "Set global oldest timestamp: %s",
       __wt_timestamp_to_string(conn->txn_global.oldest_timestamp, ts_string));
 
     return (0);
@@ -901,7 +904,7 @@ __wt_txn_recover(WT_SESSION_IMPL *session, const char *cfg[])
      * get truncated.
      */
     r.metadata_only = false;
-    __wt_verbose(session, WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS,
+    __wt_verbose(session, WT_VERB_RECOVERY_ALL(session),
       "Main recovery loop: starting at %" PRIu32 "/%" PRIu32 " to %" PRIu32 "/%" PRIu32,
       r.ckpt_lsn.l.file, r.ckpt_lsn.l.offset, r.max_rec_lsn.l.file, r.max_rec_lsn.l.offset);
     WT_ERR(__wt_log_needs_recovery(session, &r.ckpt_lsn, &needs_rec));
@@ -922,7 +925,7 @@ __wt_txn_recover(WT_SESSION_IMPL *session, const char *cfg[])
     }
 
     if (!hs_exists) {
-        __wt_verbose(session, WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS, "%s",
+        __wt_verbose(session, WT_VERB_RECOVERY_ALL(session), "%s",
           "Creating the history store before applying log records. Likely recovering after an"
           "unclean shutdown on an earlier version");
         /*
@@ -997,7 +1000,8 @@ done:
         if (conn->txn_global.recovery_timestamp != WT_TS_NONE)
             conn->txn_global.has_stable_timestamp = true;
 
-        __wt_verbose(session, WT_VERB_RECOVERY | WT_VERB_RTS,
+        __wt_verbose(session,
+          WT_VERBOSE_ISSET(session, WT_VERB_RECOVERY) ? WT_VERB_RECOVERY : WT_VERB_RTS,
           "performing recovery rollback_to_stable with stable timestamp: %s and oldest timestamp: "
           "%s",
           __wt_timestamp_to_string(conn->txn_global.stable_timestamp, ts_string[0]),
diff --git a/src/txn/txn_rollback_to_stable.c b/src/txn/txn_rollback_to_stable.c
index 6aee858e9..aeb22ae07 100644
--- a/src/txn/txn_rollback_to_stable.c
+++ b/src/txn/txn_rollback_to_stable.c
@@ -12,8 +12,10 @@
     (F_ISSET(S2C(session), WT_CONN_RECOVERING) && (txnid) >= S2C(session)->recovery_ckpt_snap_min)
 
 /* Enable rollback to stable verbose messaging during recovery. */
-#define WT_VERB_RECOVERY_RTS(session) \
-    (F_ISSET(S2C(session), WT_CONN_RECOVERING) ? WT_VERB_RECOVERY | WT_VERB_RTS : WT_VERB_RTS)
+#define WT_VERB_RECOVERY_RTS(session)                                                    \
+    (F_ISSET(S2C(session), WT_CONN_RECOVERING) ?                                         \
+        (WT_VERBOSE_ISSET(session, WT_VERB_RECOVERY) ? WT_VERB_RECOVERY : WT_VERB_RTS) : \
+        WT_VERB_RTS)
 
 /*
  * __rollback_delete_hs --
