I think they show the two most interesting approaches to object oriented languages. Personally I think static typing can never capture the richness of behavior object orientation is designed to create. Message passing is great when you have to communicate between different threads, tasks, or computers. And blocks are great, but it might be even better with true anonymous functions. So Self has the leg up in my book.
And blocks are great, but it might be even better with true anonymous functions.
[Blocks are anonymous functions, so what do you mean by that statement? Can you elaborate?]
Dylan's type system is only optionally static. Just as in CommonLisp, you may choose to put type annotations in your code, or you may choose not to. MessagePassing is a subset of MultipleDispatch; calls that dispatch only on the invoked object can be viewed as message passings. Thus, Dylan has MessagePassing.
It's only MessagePassing in the ProgrammingLanguage sense we're used to from SmalltalkLanguage etc. MessagePassing also refers to a concurrency model based on sending asynchronous messages, which Dylan does not support (it could in theory, but last I read, Gwydion had problems just supporting threads, let alone asynchronous message passing). See ActorsModel and MessagePassingConcurrency, also AlanKayOnMessaging.
See also IoLanguage.