We present a new foreign-function interface for SML/NJ. It is based on the idea of data-level interoperability -- the ability of ML programs to inspect as well as manipulate C data structures directly. The core component of this work is an encoding of the almost complete C type system in ML types. The encoding makes extensive use of a "folklore" typing trick, taking advantage of ML's polymorphism, its type constructors, its abstraction mechanisms, and even functors. A small low-level component which deals with C struct and union declarations as well as program linkage is hidden from the programmer's eye by a simple program-generator tool that translates C declarations to corresponding ML glue code.