diff --git a/py/builtin.h b/py/builtin.h
index ca5c8a52d890769696a27972a83b86cd3223beac..050a2161c1c01cd62334c35a93c0bc55dd9afc53 100644
--- a/py/builtin.h
+++ b/py/builtin.h
@@ -27,6 +27,4 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_sorted_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_sum_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_str_obj);
 
-MP_DECLARE_CONST_FUN_OBJ(mp_builtin_mem_total_obj);
-MP_DECLARE_CONST_FUN_OBJ(mp_builtin_mem_current_obj);
-MP_DECLARE_CONST_FUN_OBJ(mp_builtin_mem_peak_obj);
+void mp_module_micropython_init(void);
diff --git a/py/builtinmp.c b/py/builtinmp.c
index bbfdab0d57cfaeb8b79d6f3fc705347ca2c01d58..f72a80f1a84e944fd321b3327e240fa4e42199a4 100644
--- a/py/builtinmp.c
+++ b/py/builtinmp.c
@@ -7,7 +7,9 @@
 
 #include "misc.h"
 #include "mpconfig.h"
+#include "mpqstr.h"
 #include "obj.h"
+#include "runtime.h"
 #include "builtin.h"
 
 // Various builtins specific to MicroPython runtime,
@@ -15,18 +17,29 @@
 
 #if MICROPY_MEM_STATS
 static mp_obj_t mem_total() {
-    return MP_OBJ_NEW_SMALL_INT(m_get_total_bytes_allocated());
+    return MP_OBJ_NEW_SMALL_INT((machine_int_t)m_get_total_bytes_allocated());
 }
 
 static mp_obj_t mem_current() {
-    return MP_OBJ_NEW_SMALL_INT(m_get_current_bytes_allocated());
+    return MP_OBJ_NEW_SMALL_INT((machine_int_t)m_get_current_bytes_allocated());
 }
 
 static mp_obj_t mem_peak() {
-    return MP_OBJ_NEW_SMALL_INT(m_get_peak_bytes_allocated());
+    return MP_OBJ_NEW_SMALL_INT((machine_int_t)m_get_peak_bytes_allocated());
 }
 
 MP_DEFINE_CONST_FUN_OBJ_0(mp_builtin_mem_total_obj, mem_total);
 MP_DEFINE_CONST_FUN_OBJ_0(mp_builtin_mem_current_obj, mem_current);
 MP_DEFINE_CONST_FUN_OBJ_0(mp_builtin_mem_peak_obj, mem_peak);
 #endif
+
+void mp_module_micropython_init(void) {
+    mp_obj_t m_mp = mp_obj_new_module(MP_QSTR_micropython);
+    rt_store_name(MP_QSTR_micropython, m_mp);
+
+#if MICROPY_MEM_STATS
+    rt_store_attr(m_mp, qstr_from_str_static("mem_total"), (mp_obj_t)&mp_builtin_mem_total_obj);
+    rt_store_attr(m_mp, qstr_from_str_static("mem_current"), (mp_obj_t)&mp_builtin_mem_current_obj);
+    rt_store_attr(m_mp, qstr_from_str_static("mem_peak"), (mp_obj_t)&mp_builtin_mem_peak_obj);
+#endif
+}
diff --git a/py/runtime.c b/py/runtime.c
index 09e4237affc127315ecf64ca3630f947f2ae0ccc..d8fc3ff6e40eb39f91ed343d4c34ccb363725d0a 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -157,13 +157,7 @@ void rt_init(void) {
     mp_obj_new_module(qstr_from_str_static("sys"));
 #endif
 
-    mp_obj_t m_mp = mp_obj_new_module(qstr_from_str_static("micropython"));
-    rt_store_name(qstr_from_str_static("micropython"), m_mp);
-#if MICROPY_MEM_STATS
-    rt_store_attr(m_mp, qstr_from_str_static("mem_total"), (mp_obj_t)&mp_builtin_mem_total_obj);
-    rt_store_attr(m_mp, qstr_from_str_static("mem_current"), (mp_obj_t)&mp_builtin_mem_current_obj);
-    rt_store_attr(m_mp, qstr_from_str_static("mem_peak"), (mp_obj_t)&mp_builtin_mem_peak_obj);
-#endif
+    mp_module_micropython_init();
 
     next_unique_code_id = 1; // 0 indicates "no code"
     unique_codes_alloc = 0;