Cecil is a pure object-oriented, prototype-based language made to support fast building of high-quality, extensible software. It combines multi-methods with a simple classless object model (prototypes), a kind of dynamic inheritance, modules, and optional static type checking. Instance variables are accessed only via messages, allowing instance variables to be replaced or overridden by methods and vice versa. A predicate objects mechanism allows objects to be classified automatically based on run-time (mutable) state. The static type system distinguishes between subtyping and code inheritance, but enables these two graphs to be described with one set of declarations, streamlining the common case where the two graphs are parallel. It has a fairly flexible form of parameterization, with explicitly parameterized objects, types, methods, and implicitly parameterized methods related to the polymorphic functions commonly found in functional languages. By making type declarations optional, it aims to allow mixing of and migration between exploratory and production programming styles. It supports a module mechanism that lets independently-developed subsystems be encapsulated, letting them be type-checked and reasoned about in isolation despite presence of multi-methods and subclassing. Objects can be extended externally with added methods and instance variables, often encapsulated in separate modules, supporting a kind of role-based or subject-oriented programming style.