diff --git a/libwccl/values/bool.h b/libwccl/values/bool.h
index 53393fb1ba509b0df7188fe3094a05169d26cfdc..a9152139dbf66a68a8940d7b01010fc0c469212a 100644
--- a/libwccl/values/bool.h
+++ b/libwccl/values/bool.h
@@ -39,6 +39,17 @@ public:
 		return val_ ? "True" : "False";
 	}
 
+	typedef void (Bool::*safe_bool)() const;
+	void safe_bool_helper() const {}
+
+	operator safe_bool() const {
+		return val_ ? &Bool::safe_bool_helper : 0;
+	}
+
+	bool operator!() const {
+		return !val_;
+	}
+
 private:
 	bool val_;
 };
diff --git a/tests/values.cpp b/tests/values.cpp
index d87c1b1f3744ea5e9280f5e87c40c220c6c7c257..837e1e2eeeedaff6bae9c92edf986006b935bc77 100644
--- a/tests/values.cpp
+++ b/tests/values.cpp
@@ -188,4 +188,22 @@ BOOST_AUTO_TEST_CASE(position_ops)
 	BOOST_CHECK(end.equals(minus_one, sc));
 }
 
+BOOST_AUTO_TEST_CASE(bool_safe_bool)
+{
+	Bool b(false);
+	BOOST_CHECK(!b);
+	if (b) {
+		BOOST_ERROR("if (b) on Bool(false)");
+	}
+	b.set_value(true);
+	if (!b) {
+		BOOST_ERROR("if (!b) on Bool(true)");
+	}
+	if (b) {
+	} else {
+		BOOST_ERROR("if (b) else reached on Bool(true)");
+	}
+	BOOST_CHECK(b);
+}
+
 BOOST_AUTO_TEST_SUITE_END()