Everything, absolutely everything is an object, even non-boxed constant 1. In a wider sense of this word, objects in the sense of OOP are all objects of class and structure types, all arrays and boxed forms of primitive types and enumerations.
Also, delegate and event instances are objects of some implicitly defined classes. You can find it out if you use GetType() and Reflection on those instances.
This is much more delicate matter. Please see my past answer and recent article:
Confusion about delegates
Dynamic Method Dispatcher
Never use ArrayList!
This class is made obsolete with v.2.0 when generics were introduced. Use
instead. The element type can be absolutely anything.
Even the same type as the list itself, which makes a tree structure.
(See my recent answer: where're we can find a open source c# tree structure
This should answer your question.