Only one instance of the class can exist
It implements ArrayAccess
It is designed to store values of various types
It uses static methods
It takes responsibility for instantiating objects