Start by implementing spatially inhomogeneous atmospheric attenuation. Divide each ray into intervals. For each interval, interpolate between the ray's color and some constant fog color based on a procedurally computed opacity for that location in space. Experiment with opacity functions. Implement a class of more complicated primitives from Hanrahan's chapter in Glassner's book.
Fractals are relatively easy to implement and fun to use.
For extra fun, map textures onto your patches or fractals. Mimic the object's appearance as closely as you can. The object should be non-trivial, i.e. don't simulate a pane of glass. Use a scanner to input the cover design. All my keys are scratched up.