diff --git a/src/core/sys/posix/config.d b/src/core/sys/posix/config.d
index 60f4844..f7d5def 100644
--- a/src/core/sys/posix/config.d
+++ b/src/core/sys/posix/config.d
@@ -24,3 +24,13 @@ version( linux )
     enum bool  __USE_FILE_OFFSET64  = __USE_LARGEFILE64;
     enum bool  __REDIRECT           = false;
 }
+
+/// %% FIXME: Probably not consistent for all architectures.
+static if( size_t.sizeof == 8)
+{
+    enum uint __WORDSIZE            = 64;
+}
+else
+{
+    enum uint __WORDSIZE            = 32;
+}
diff --git a/src/core/sys/posix/signal.d b/src/core/sys/posix/signal.d
index 4713ed7..badbee7 100644
--- a/src/core/sys/posix/signal.d
+++ b/src/core/sys/posix/signal.d
@@ -309,7 +309,7 @@ version( linux )
 
     private enum __SI_MAX_SIZE = 128;
 
-    static if( false /* __WORDSIZE == 64 */ )
+    static if( __WORDSIZE == 64 )
     {
         private enum __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 4);
     }
@@ -1008,7 +1008,7 @@ version( linux )
 {
     private enum __SIGEV_MAX_SIZE = 64;
 
-    static if( false /* __WORDSIZE == 64 */ )
+    static if( __WORDSIZE == 64 )
     {
         private enum __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 4);
     }
diff --git a/src/core/sys/posix/sys/stat.d b/src/core/sys/posix/sys/stat.d
index 8a1b22d..748e90d 100644
--- a/src/core/sys/posix/sys/stat.d
+++ b/src/core/sys/posix/sys/stat.d
@@ -80,7 +80,7 @@ mode_t umask(mode_t);
 
 version( linux )
 {
-    static if( __USE_LARGEFILE64 )
+    static if( __WORDSIZE == 64 || __USE_LARGEFILE64 )
     {
         private alias uint _pad_t;
     }
@@ -89,54 +89,129 @@ version( linux )
         private alias ushort _pad_t;
     }
 
-    struct stat_t
+    static if( __USE_LARGEFILE64 )
     {
-        dev_t       st_dev;
-        _pad_t      __pad1;
-      static if( __USE_FILE_OFFSET64 )
-      {
-        ino_t       __st_ino;
-      }
-      else
-      {
-        ino_t       st_ino;
-      }
-        mode_t      st_mode;
-        nlink_t     st_nlink;
-        uid_t       st_uid;
-        gid_t       st_gid;
-        dev_t       st_rdev;
-        _pad_t      __pad2;
-        off_t       st_size;
-        blksize_t   st_blksize;
-        blkcnt_t    st_blocks;
-      static if( false /*__USE_MISC*/ ) // true if _BSD_SOURCE || _SVID_SOURCE
-      {
-        timespec    st_atim;
-        timespec    st_mtim;
-        timespec    st_ctim;
-        alias st_atim.tv_sec st_atime;
-        alias st_mtim.tv_sec st_mtime;
-        alias st_ctim.tv_sec st_ctime;
-      }
-      else
-      {
-        time_t      st_atime;
-        c_ulong     st_atimensec;
-        time_t      st_mtime;
-        c_ulong     st_mtimensec;
-        time_t      st_ctime;
-        c_ulong     st_ctimensec;
-      }
-      static if( __USE_FILE_OFFSET64 )
-      {
-        ino_t       st_ino;
-      }
-      else
-      {
-        c_ulong     __unused4;
-        c_ulong     __unused5;
-      }
+        struct stat_t
+        {
+            dev_t       st_dev;
+          static if( __WORDSIZE == 64 )
+          {
+            ino_t       st_ino;
+            nlink_t     st_nlink;
+            mode_t      st_mode;
+          }
+          else
+          {
+            _pad_t      __pad1;
+            _pad_t      __st_ino;
+            mode_t      st_mode;
+            nlink_t     st_nlink;
+          }
+            uid_t       st_uid;
+            gid_t       st_gid;
+          static if( __WORDSIZE == 64 )
+          {
+            _pad_t      __pad0;
+            dev_t       st_rdev;
+            off_t       st_size;
+          }
+          else
+          {
+            dev_t       st_rdev;
+            _pad_t      __pad2;
+            off_t       st_size;
+          }
+            blksize_t   st_blksize;
+            blkcnt_t    st_blocks;
+          static if( true /*__USE_MISC*/ ) // true if _BSD_SOURCE || _SVID_SOURCE
+          {
+            timespec    st_atim;
+            timespec    st_mtim;
+            timespec    st_ctim;
+            @property time_t st_atime() { return st_atim.tv_sec; }
+            @property time_t st_mtime() { return st_mtim.tv_sec; }
+            @property time_t st_ctime() { return st_ctim.tv_sec; }
+          }
+          else
+          {
+            time_t      st_atime;
+            c_ulong     st_atimensec;
+            time_t      st_mtime;
+            c_ulong     st_mtimensec;
+            time_t      st_ctime;
+            c_ulong     st_ctimensec;
+          }
+          static if( __WORDSIZE == 64 )
+          {
+            c_long      __unused[3];
+          }
+          else
+          {
+            ino_t       st_ino;
+          }
+        }
+    }
+    else
+    {
+        struct stat_t
+        {
+            dev_t       st_dev;
+          static if( __WORDSIZE == 64 )
+          {
+            ino_t       st_ino;
+            nlink_t     st_nlink;
+            mode_t      st_mode;
+          }
+          else
+          {
+            _pad_t      __pad1;
+            ino_t       st_ino;
+            mode_t      st_mode;
+            nlink_t     st_nlink;
+          }
+            uid_t       st_uid;
+            gid_t       st_gid;
+          static if( __WORDSIZE == 64 )
+          {
+            _pad_t      __pad0;
+            dev_t       st_rdev;
+          }
+          else
+          {
+            dev_t       st_rdev;
+            _pad_t      __pad2;
+          }
+            off_t       st_size;
+            blksize_t   st_blksize;
+            blkcnt_t    st_blocks;
+          static if( true /*__USE_MISC*/ ) // true if _BSD_SOURCE || _SVID_SOURCE
+          {
+            timespec    st_atim;
+            timespec    st_mtim;
+            timespec    st_ctim;
+            @property time_t st_atime() { return st_atim.tv_sec; }
+            @property time_t st_mtime() { return st_mtim.tv_sec; }
+            @property time_t st_ctime() { return st_ctim.tv_sec; }
+          }
+          else
+          {
+            time_t      st_atime;
+            c_ulong     st_atimensec;
+            time_t      st_mtime;
+            c_ulong     st_mtimensec;
+            time_t      st_ctime;
+            c_ulong     st_ctimensec;
+          }
+          static if( __WORDSIZE == 64 )
+          {
+            c_long      __unused[3];
+          }
+          else
+          {
+            c_ulong     __unused4;
+            c_ulong     __unused5;
+          }
+        }
     }
 
     enum S_IRUSR    = 0400;
diff --git a/src/core/sys/posix/sys/types.d b/src/core/sys/posix/sys/types.d
index b0d86db..4c3006d 100644
--- a/src/core/sys/posix/sys/types.d
+++ b/src/core/sys/posix/sys/types.d
@@ -42,18 +42,18 @@ uid_t
 
 version( linux )
 {
-  static if( __USE_FILE_OFFSET64 )
-  {
-    alias long      blkcnt_t;
-    alias ulong     ino_t;
-    alias long      off_t;
-  }
-  else
+  static if( __WORDSIZE == 64 || ! __USE_FILE_OFFSET64 )
   {
     alias c_long    blkcnt_t;
     alias c_ulong   ino_t;
     alias c_long    off_t;
   }
+  else
+  {
+    alias long      blkcnt_t;
+    alias ulong     ino_t;
+    alias long      off_t;
+  }
     alias c_long    blksize_t;
     alias ulong     dev_t;
     alias uint      gid_t;
