Information flow through a program is secure if users' high-security inputs do not affect low-security behavior of a program, that is, if an attacker cannot learn any secrets by observing public outputs. Type systems have been used to guarantee secure information flow: a language is designed so that only secure programs are well-typed. We illustrate the principle with one such language based on monads --- types that are usually used to indicate the presence of side-effects such as input/output, mutation of a memory store, exceptions, etc. We show that monads can also be used to reason about secure information flow. Prior secure languages tag all values with security levels. In contrast, in our language only mutable store locations are tagged, and monads classify computations according to the security levels of the locations they access. Starting from a purely functional language, ours is a lighter-weight extension that simplifies the task of reasoning about programs. In this talk, I will present a mini-review, suitable for a general computer science audience, of how monads are used for including effects such as I/O and mutation in purely functional languages. I will then show how we can further refine monadic types into a form suitable for reasoning about security. This is joint work with Karl Crary and Frank Pfenning. This talk is in partial fulfillment of the speaking requirement.