diff --git a/include/stdbool.h b/include/stdbool.h
index 1a9f870bb916372337084702da06bfed1cd9267e..59cce7a9613c67bbb0bb53f2e6ceb6d3ead74763 100644
--- a/include/stdbool.h
+++ b/include/stdbool.h
@@ -1,9 +1,19 @@
 #ifndef _STDBOOL_H
 #define _STDBOOL_H
 
+#ifndef __cplusplus
 typedef _Bool bool;
 #define true 1
 #define false 0
+#else /* __cplusplus */
+typedef bool _Bool;
+#if __cplusplus < 201103L
+#define false false
+#define true true
+#endif /*__cplusplus < 201103L*/
+#endif /* __cplusplus */
+
 #define __bool_true_false_are_defined 1
 
+
 #endif /* _STDBOOL_H */
diff --git a/include/sys/types.h b/include/sys/types_internal.h
similarity index 88%
rename from include/sys/types.h
rename to include/sys/types_internal.h
index 19cf76bb78842cd92c32b428e6fead5c88776eed..5e533e810a131f679be0a1a0c944aec2d907f695 100644
--- a/include/sys/types.h
+++ b/include/sys/types_internal.h
@@ -1,5 +1,5 @@
-#ifndef _SYS_TYPES_H
-#define _SYS_TYPES_H
+#ifndef _SYS_TYPES_INTERNAL_H
+#define _SYS_TYPES_INTERNAL_H
 #include <stddef.h>
 
 typedef long blksize_t;
@@ -31,5 +31,4 @@ typedef unsigned long u_long, ulong;
 typedef long long quad_t;
 typedef unsigned long long u_quad_t;
 typedef char *caddr_t;
-
-#endif /* _SYS_TYPES_H */
+#endif /* _SYS_TYPES_INTERNAL_H */
diff --git a/src/c/dlmalloc.c b/src/c/dlmalloc.c
index 13db7003174602841434df26756549d16fd03df1..8ae1f7a39098ff0821194827af7344def34a5150 100644
--- a/src/c/dlmalloc.c
+++ b/src/c/dlmalloc.c
@@ -613,7 +613,7 @@ void *memset(void *s, int c, size_t n);
 #endif  /* DARWIN */
 
 #ifndef LACKS_SYS_TYPES_H
-#include <sys/types.h>  /* For size_t */
+#include <sys/types_internal.h>  /* For size_t */
 #endif  /* LACKS_SYS_TYPES_H */
 
 /* The maximum possible size_t value has all bits set */
diff --git a/src/c/fcntl.c b/src/c/fcntl.c
index 76b92022e1017a55f3a52a185f14f26a1eb47e7d..23c48fa12af16a422e1599ea4816b551a6958b03 100644
--- a/src/c/fcntl.c
+++ b/src/c/fcntl.c
@@ -1,5 +1,5 @@
 #include <stdarg.h>
-#include <sys/types.h>
+#include <sys/types_internal.h>
 
 // TODO: Can be implemented in rust when cbindgen supports "..." syntax
 
diff --git a/src/header/mod.rs b/src/header/mod.rs
index 81934256d8024abf23c329213ed50fb154aee20a..eb2bbeab0d9a372f2d93a05f0a904ed04aa11af2 100644
--- a/src/header/mod.rs
+++ b/src/header/mod.rs
@@ -51,6 +51,7 @@ pub mod arch_aarch64_user;
 pub mod arch_x64_user;
 pub mod sys_procfs;
 pub mod sys_random;
+pub mod sys_types;
 pub mod sys_uio;
 pub mod sys_un;
 pub mod sys_utsname;
diff --git a/src/header/sys_types/cbindgen.toml b/src/header/sys_types/cbindgen.toml
new file mode 100644
index 0000000000000000000000000000000000000000..c8b7fca74b08d846e1673db58bfeecec40955eda
--- /dev/null
+++ b/src/header/sys_types/cbindgen.toml
@@ -0,0 +1,7 @@
+sys_includes = ["stddef.h", "sys/types_internal.h", "sys/select.h"]
+include_guard = "_SYS_TYPES_H"
+language = "C"
+style = "Tag"
+
+[enum]
+prefix_with_name = true
\ No newline at end of file
diff --git a/src/header/sys_types/mod.rs b/src/header/sys_types/mod.rs
new file mode 100644
index 0000000000000000000000000000000000000000..c348094fca39b54edeaa2b6b47247069f7632405
--- /dev/null
+++ b/src/header/sys_types/mod.rs
@@ -0,0 +1,2 @@
+//! sys/types.h
+use crate::platform::types::*;