We present a type system that combines, in a controlled way,
first-order polymorphism with intersection types, union types, and
subtyping, and prove its safety. We then define a type reconstruction
algorithm that is sound and terminating. This yields a system in which
unannotated functions are given polymorphic types (thanks to
Hindley-Milner) that can express the overloaded behavior of the
functions they type (thanks to the intersection introduction rule) and
that are deduced by applying advanced techniques of type narrowing
(thanks to the union elimination rule). This makes the system a prime
candidate to type dynamic languages.