diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index aee50cf47078e0a099c02a63c0d37441ea27c954..60376e59aaf589ed414e43e18ea16ad25dac3358 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -518,6 +518,9 @@ hs_exit_(bool wait_foreign)
     shutdownAsyncIO(wait_foreign);
 #endif
 
+    /* tear down statistics subsystem */
+    stat_exit();
+
     // Finally, free all our storage.  However, we only free the heap
     // memory if we have waited for foreign calls to complete;
     // otherwise a foreign call in progress may still be referencing
diff --git a/rts/Stats.c b/rts/Stats.c
index 8fb546715157d659db45c9e28b1332ce0bf5dd8d..1a91e706fb8442c8a050dbe232a559b45c8f3475 100644
--- a/rts/Stats.c
+++ b/rts/Stats.c
@@ -1220,7 +1220,7 @@ static void report_one_line(const RTSSummaryStats * sum)
 }
 
 void
-stat_exit (void)
+stat_exitReport (void)
 {
     RTSSummaryStats sum;
     init_RTSSummaryStats(&sum);
@@ -1425,9 +1425,6 @@ stat_exit (void)
             }
         }
         RELEASE_LOCK(&stats_mutex);
-#if defined(THREADED_RTS)
-        closeMutex(&stats_mutex);
-#endif
 
         statsFlush();
         statsClose();
@@ -1451,6 +1448,13 @@ stat_exit (void)
     RELEASE_LOCK(&all_tasks_mutex);
 }
 
+void stat_exit()
+{
+#if defined(THREADED_RTS)
+        closeMutex(&stats_mutex);
+#endif
+}
+
 /* Note [Work Balance]
 ----------------------
 Work balance is a measure of how evenly the work done during parallel garbage
diff --git a/rts/Stats.h b/rts/Stats.h
index 103564a82a4d2c5e316ab181ce796df34a66bf3b..9d62acef371de6a7e85f4c9a3a1ff19e0ed7626c 100644
--- a/rts/Stats.h
+++ b/rts/Stats.h
@@ -58,6 +58,7 @@ void      stat_endHeapCensus(void);
 void      stat_startExit(void);
 void      stat_endExit(void);
 
+void      stat_exitReport(void);
 void      stat_exit(void);
 void      stat_workerStop(void);
 
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index 86a111fca820d3feef99e964a92cc6920652abcc..a88073d1f833ad7b2c8a383b2c1ba1d7f20fd42f 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -302,7 +302,7 @@ exitStorage (void)
 {
     nonmovingExit();
     updateNurseriesStats();
-    stat_exit();
+    stat_exitReport();
 }
 
 void