I haven't checked the inits.c ordering change closely, but
make check and test-rubyspec passes:

diff --git a/inits.c b/inits.c
index fe0aade..da8cfb1 100644
--- a/inits.c
+++ b/inits.c
@@ -46,7 +46,6 @@ rb_call_inits(void)
     CALL(Time);
     CALL(Random);
     CALL(signal);
-    CALL(process);
     CALL(load);
     CALL(Proc);
     CALL(Binding);
@@ -56,6 +55,7 @@ rb_call_inits(void)
     CALL(VM);
     CALL(ISeq);
     CALL(Thread);
+    CALL(process);
     CALL(Cont);
     CALL(Rational);
     CALL(Complex);
diff --git a/process.c b/process.c
index 8bb52f7..5bf59ac 100644
--- a/process.c
+++ b/process.c
@@ -1007,6 +1007,8 @@ proc_waitall(void)
     return result;
 }
 
+static VALUE rb_cWaiter;
+
 static inline ID
 id_pid(void)
 {
@@ -1038,7 +1040,7 @@ rb_detach_process(rb_pid_t pid)
 {
     VALUE watcher = rb_thread_create(detach_process_watcher, (void*)(VALUE)pid);
     rb_thread_local_aset(watcher, id_pid(), PIDT2NUM(pid));
-    rb_define_singleton_method(watcher, "pid", detach_process_pid, 0);
+    RBASIC_SET_CLASS(watcher, rb_cWaiter);
     return watcher;
 }
 
@@ -7516,6 +7518,10 @@ Init_process(void)
     rb_define_module_function(rb_mProcess, "waitall", proc_waitall, 0);
     rb_define_module_function(rb_mProcess, "detach", proc_detach, 1);
 
+    rb_cWaiter = rb_define_class_under(rb_mProcess, "Waiter", rb_cThread);
+    rb_undef_method(CLASS_OF(rb_cWaiter), "new");
+    rb_define_method(rb_cWaiter, "pid", detach_process_pid, 0);
+
     rb_cProcessStatus = rb_define_class_under(rb_mProcess, "Status", rb_cObject);
     rb_undef_method(CLASS_OF(rb_cProcessStatus), "new");
 
diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb
index 608d663..a3fa36e 100644
--- a/test/ruby/test_process.rb
+++ b/test/ruby/test_process.rb
@@ -1965,4 +1965,10 @@ EOS
       runner.close
     end
   end if defined?(fork)
+
+  def test_process_detach
+    pid = fork {}
+    th = Process.detach(pid)
+    assert_equal pid, th.pid
+  end if defined?(fork)
 end

-- 
EW