diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for ghc-debug-stub
 
+## 0.7.0.0 -- 2025-05-20
+
+* Compatability with 9.10 and 9.12
+
 ## 0.6.0.0 -- 2024-04-10
 
 * Add requests for decoding cost centres and other profiling info
diff --git a/cbits/stub.cpp b/cbits/stub.cpp
--- a/cbits/stub.cpp
+++ b/cbits/stub.cpp
@@ -149,7 +149,7 @@
             this->sock.write((char *) &status_payload, sizeof(uint16_t));
             // then the body, usually empty
             trace("responding with body of length %lu: ( ", len);
-            for (int i = 0; i < len; i++)
+            for (size_t i = 0; i < len; i++)
             {
                 trace("%02X", buf[i]);
             }
@@ -262,7 +262,7 @@
 
 
 void collect_threads(std::function<void(StgTSO*)> f) {
-    for (int g=0; g < RtsFlags.GcFlags.generations; g++) {
+    for (uint32_t g=0; g < RtsFlags.GcFlags.generations; g++) {
         StgTSO *tso = generations[g].threads;
         while (tso != END_TSO_QUEUE) {
             f(tso);
@@ -295,7 +295,7 @@
 // Size fields are always uint32_t in network-byte-order.
 static void write_size(Response& resp, StgWord size) {
     uint32_t size_payload = htonl(size);
-    trace("SIZE %llu", size);
+    trace("SIZE %lu", size);
     resp.write((uint32_t) size_payload);
 }
 
@@ -315,8 +315,6 @@
 }
 
 static void write_small_bitmap(Response& resp, StgWord bitmap, StgWord size) {
-    uint32_t i = 0;
-
     // Small bitmap
     write_size(resp, size);
     while (size > 0) {
@@ -643,7 +641,7 @@
         break;
 
       case CMD_SAVED_OBJECTS:
-        int i;
+        StgWord i;
         for (i = 0; i < g_savedObjectState.n_objects; i++) {
           StgStablePtr v = g_savedObjectState.objects[i];
           resp.write((uint64_t)(UNTAG_CLOSURE((StgClosure *)deRefStablePtr(v))));
@@ -740,20 +738,20 @@
 
 
         trace("ELT: %p\n", info_table);
-#if MIN_VERSION_GLASGOW_HASKELL(9,11,20240401,0)
+#if MIN_VERSION_GLASGOW_HASKELL(9,10,0,0)
         InfoProvEnt elt;
         int elt_res = lookupIPE(info_table, &elt);
 #else
         InfoProvEnt * elt = lookupIPE(info_table);
         int elt_res = (bool) elt;
 #endif
-        uint32_t len_payload;
+
         if (!elt_res){
           trace("NOT FOUND\n");
           resp.write((uint32_t) 0);
         }
         else {
-#if MIN_VERSION_GLASGOW_HASKELL(9,11,20240401,0)
+#if MIN_VERSION_GLASGOW_HASKELL(9,10,0,0)
           InfoProv ip = elt.prov;
 #else
           InfoProv ip = elt->prov;
@@ -764,7 +762,17 @@
 
           //  Using the function just produces garbage.. no idea why
           write_string(resp, ip.table_name);
+#if MIN_VERSION_GLASGOW_HASKELL(9,10,2,0)
+          // In 9.10, GHC changed the closure_desc to uint32_t.
+          // To maintain the previous behaviour, we format the id as its string
+          // representation. For example, the number 10 is represented as the
+          // string "10".
+          char closure_desc_buf[CLOSURE_DESC_BUFFER_SIZE] = {};
+          formatClosureDescIpe(&elt, closure_desc_buf);
+          write_string(resp, closure_desc_buf);
+#else
           write_string(resp, ip.closure_desc);
+#endif
           write_string(resp, ip.ty_desc);
           write_string(resp, ip.label);
           write_string(resp, ip.module);
diff --git a/cbits/trace.h b/cbits/trace.h
--- a/cbits/trace.h
+++ b/cbits/trace.h
@@ -1,4 +1,4 @@
 #pragma once
 
 void trace(const char *fmt, ...)
-    __attribute__((format (PRINTF, 1, 2)));
+    __attribute__((format (printf, 1, 2)));
diff --git a/ghc-debug-stub.cabal b/ghc-debug-stub.cabal
--- a/ghc-debug-stub.cabal
+++ b/ghc-debug-stub.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                ghc-debug-stub
-version:             0.6.0.0
+version:             0.7.0.0
 synopsis:            Functions for instrumenting your application so the heap
                      can be analysed with ghc-debug-common.
 description:         Functions for instrumenting your application so the heap can
@@ -31,8 +31,8 @@
   build-depends:       base >=4.16 && < 5
                      , directory ^>= 1.3
                      , filepath >= 1.4 && < 1.6
-                     , ghc-prim >= 0.8 && < 0.12
-                     , ghc-debug-convention == 0.6.0.0
+                     , ghc-prim >= 0.8 && < 0.14
+                     , ghc-debug-convention == 0.7.0.0
   default-language:    Haskell2010
   cxx-sources:         cbits/stub.cpp, cbits/socket.cpp, cbits/trace.cpp
   cxx-options:         -std=gnu++11 -pthread -O3 -g3 -DTHREADED_RTS
